将每个字符出现的次数(顺便找出最小的次数)建立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;
}