刪除字串中出現次數最少(最多)的字元
阿新 • • 發佈:2021-06-11
@
目錄注意:用的min_element()函式count()函式等都需要包含標頭檔案 include <algorithm>
刪除出現次數最少的
題目:給定一個字串,刪除出現字數最少的字元。
思路:字元最多26個,用長度為26的陣列儲存各個字元的數量,然後計算出最小值,再對字串遍歷一遍,如果字元對應的數字大於最小值就輸出(排除次數為0的情況)。注意一點是字元出現次數可能是0,這種情況要排除的。
1、方法一
string delChar(string s,int Len) { int arr[26]={0}; for(int i=0;i<Len;++i) //求各個字元的個數 arr[s[i]-'a']++; string s1=""; //int* q = min_element(arr, arr + 26); //返回陣列最小值,但這極大可能可能為0,所以要排除0的干擾,這法子不行 int min=*(max_element(arr, arr + 26)); //初始化為陣列最大值 for(int i=0;i<26;++i){ if(arr[i]>0&&arr[i]<min){ //排除0的干擾並求最小值 min=arr[i]; } } for(int j=0;j<Len;++j){ //把出現次數不是最小值的字元加到結果字串中 if(arr[s[j]-'a']>min) s1 += s[j]; } return s1; }
2、方法二
換一種用count()函式求字元數量的
string delChar(string s,int Len) { int arr[26]={0}; for(int i=0;i<26;++i){ arr[i]=count(s.begin(), s.end(), char(i+'a')); //用count函式求字元數量 } int min=*(max_element(arr, arr + 26)); //初始化為陣列最大值 for(int i=0;i<26;++i){ if(arr[i]>0&&arr[i]<min){ //排除0的干擾並求最小值 min=arr[i]; } } string s1=""; for(int j=0;j<Len;++j){ if(arr[s[j]-'a']>min) s1 += s[j]; } return s1; }
count()函式的使用可以看這篇博文第四個標題對應內容 4、找出源字串中有多少個目標字元,如在"the food is delicious" 找出有多少個’i’ ,答案3個
刪除出現次數最多的
再來一個刪除出現最大次數的字元
string delChar(string s,int Len) { int arr[26]={0}; for(int i=0;i<26;++i){ arr[i]=count(s.begin(), s.end(), char(i+'a')); //用count函式求字元數量 } int max=*(max_element(arr, arr + 26)); //求陣列最大值 string s1=""; for(int j=0;j<Len;++j){ if(arr[s[j]-'a']!=max && arr[s[j]-'a']!=0) s1 += s[j]; } return s1; }
利用利用find()函式和erase()函式來刪除
最後一步求s1也可以用刪除原字串中滿足條件的字元來實現,比如利用find()函式和erase()函式來實現
....
string s1=s;
for(int j=0;j<26;++j){
if(arr[j]==max){ //如果出現了max次,就刪除字元 char(j+'a') max次
for(int i=0;i<max;++i){
int position=s1.find(char(j+'a'));
s1.erase(position,1);
}
}
}
return s1;
關於find()函式和erase()函式的用法可以參照我的這篇博文 c++裡面的find()和erase()