实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。
输出描述:
删除字符串中出现次数最少的字符后的字符串。
输入例子:
abcdd输出例子:
dd此题可以引用《华为机试在线训练-牛客网(12)密码验证合格程序》一文中衍生问题的一个思路,不过此处更简单,不需要统计子串重复情况而是统计字符重复情况,对于字符统计可以直接使用泛型算法count()。另外记录下重复次数最少的所有索引,根据索引号用“0”替换,再调用remove()算法删除所有为'0'的字符。注意:此处不能直接用string::erase()循环删除pos位置的字符,因为每次根据pos删除一个字符后索引号已改变,下一次删除无效。
完整AC的代码如下:
#include <iostream>#include <vector>#include <string>#include <algorithm>using namespace std;int main(){ string inStr; while(getline(cin,inStr)){ int tempCnt=0; int minCnt=100; vector<int > minPos; for(int i=0;i<inStr.size();i++){ tempCnt= count(inStr.begin(),inStr.end(),inStr[i]); if(tempCnt<=minCnt){ if(tempCnt<minCnt)minPos.clear(); minCnt=tempCnt; minPos.push_back(i); } } for(auto pos:minPos) inStr.replace(pos,1,"0"); int pos; while((pos=inStr.find('0'))!=string::npos){ inStr.erase(pos,1); } cout<<inStr<<endl; }}
新闻热点
疑难解答