将每个字符出现的次数(顺便找出最小的次数)建立map<字符,次数>,用map里value最小的key去比对str,相同则删除,输出剩下的str。
#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
#include <string>
using namespace std;
int main()
{
map <char, int> M;//map M用来存储str里出现过的字符和其出现次数
string str, str_bf, str1;//str1是每个字符只出现一次的字符串
cin >> str;
str_bf = str;//sort会改变str,所以备份str,之后进行移除出现次数最少的元素
int nmin = 20;// 最少的次数(可能不止一个字符)
//sort+unique得到每个字符只出现一次的字符串 str1
sort(str.begin(), str.end());
int str1_len = unique(str.begin(), str.end())- str.begin();
for (int i = 0; i < str1_len; i++)
str1.push_back(str[i]);
//每个字符出现的次数,对应添加到(map)M中,并找到最小的次数 nmin
for (int i = 0; i < str1.length(); i++)
{
int n = count(str_bf.begin(), str_bf.end(), str1[i]);
if (nmin > n) nmin = n;
/*cout << str1[i] << " : " << n << endl;*/
M[str1[i]] = n;
}
map<char, int>:: iterator itr; //map迭代器
//cout << nmin << endl;
for (itr = M.begin(); itr != M.end(); ++itr) {
if (itr->second == nmin)
for (int i = 0; i < str_bf.length(); i++)
if (str_bf[i] == itr->first)//找到出现nmin次的字符(们)
{
str_bf.erase(i, 1); //在str里删除,string.erase(i, 1)表示删除从i开始的一共1个元素
i--;// 做一次删除操作,相当于之后的字符串往前覆盖了一位,所以i--
}
}
cout << str_bf;
return 0;
}

京公网安备 11010502036488号