华为机试题:删除字符串中出现次数最少的字符

时间:2022-01-17 18:52:27

描述: 

实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。

 
题目类别:  字符串 
难度:  中级 
运行时间限制: 10Sec
内存限制: 128MByte
阶段:  入职前练习 
输入:  

字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。

 
输出:  

删除字符串中出现次数最少的字符后的字符串。

 
样例输入:
abcdd

样例输出:
dd


#include <iostream>
#include <stdio.h>
#include <string>
#include <algorithm>
#include <map>
#include <vector>

using namespace std;

int main()
{
string str,ret;
map<char,int> mmap;
vector<char> vec;
int lens = 0, i =0;
int minwords = 100000;

cin >> str;
lens = str.size();

/*统计每一个单词的个数*/
for(i = 0; i < lens; i ++)
{
mmap[str[i]]++;
}

/*找出最少的单词个数*/
map<char,int>::iterator it;
for(it = mmap.begin(); it != mmap.end(); it++)
{
if(it->second < minwords)
{
minwords = it->second ;
}
}

/*把一样少的数据,放入到vec中*/
for(it = mmap.begin(); it != mmap.end(); it++)
{
if(it->second == minwords)
{
vec.push_back(it->first);
}
}

/*求出结果字符串*/
lens = str.size();
vector<char>::iterator it_vec;
for(i = 0; i < lens; i++)
{
it_vec = find(vec.begin(),vec.end(),str[i]);

/*没有找到*/
if(it_vec == vec.end())
{
ret = ret + str[i];
}
}

cout << ret << endl;
return 0;
}