题目
实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
注意每个输入文件有多组输入,即多个字符串用回车隔开
输入描述:
字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。
输出描述:
删除字符串中出现次数最少的字符后的字符串。
题目分析:
由题目得,我们需要先标记出每种字符出现的次数,然后找出其中出现次数最少的字符 之后将其从原字符串中剔除即可
#include <iostream> #include <string> using namespace std; int main() { string s; while(cin>>s) { int count[26] = {0}; //26个字母对应26个位置 int min = 9999; for(auto a:s) { count[a - 'a']++; //出现次数加一 } for(int i = 0;i<1000;i++) { if(count[i] < min&&count[i]) min = count[i]; } for(int N = 25;N>0;N--) { if(count[N] == min) { char c = 'a'+N; for (string::iterator it = s.begin(); it < s.end(); it++) { if (*it == c) { s.erase(it); it--; /* it--很重要,因为使用erase()删除it指向的字符后,后面的字符就移了过来, it指向的位置就被后一个字符填充了,而for语句最后的it++,又使it向后移 了一个位置,所以就忽略掉了填充过来的这个字符。在这加上it--后就和for 语句的it++抵消了,使迭代器能够访问所有的字符。 */ } } } } cout<<s<<endl; } return 0; }