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

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

发布了78 篇原创文章 · 获赞 20 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43657442/article/details/103594355