注意:用的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()