删除字符串中出现次数最少(最多)的字符

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中南自动化学院至渝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值