描述
实现删除字符串中出现次数最少的字符,若出现次数最少的字符有多个,则把出现次数最少的字符都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
数据范围:输入的字符串长度满足 1 \le n \le 20 \1≤n≤20 ,保证输入的字符串中仅出现小写字母
输入描述:
字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。
输出描述:
删除字符串中出现次数最少的字符后的字符串。
示例1
输入:
aabcddd
复制输出:
aaddd
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream>
#include <string.h>
#include <malloc.h>
#include <sstream>
#include <algorithm>
#include <cstring>
#include <map>
#include <set>
#include <vector>
void print(std::vector<char> strVect)
{
for(int i = 0; i < strVect.size(); ++i)
{
std::cout << strVect.at(i);
}
std::cout << std::endl;
}
void DeleteCharLess(std::string str)
{
//1.将每个字母存储在map集合中
std::map<char, int> letterMap; //map第一个参数表示小写字母,第二个参数表示出现的次数
int len = strlen(str.c_str());
for(int i = 0; i < len; ++i)
{
char c = (char)str[i];
std::map<char,int>::iterator iterFind = letterMap.find(c);
if(0 == iterFind->second) //说明不存在,那么就插入
{
letterMap.insert(std::pair<char, int>(c, 1));
}
else //存在,在原先的基础上加一
{
int count = iterFind->second;
count++;
letterMap.erase(c);
letterMap.insert(std::pair<char, int>(c, count));
}
}
//2.找出次数最小的字母
std::multimap<int, char> inMap;
std::map<char, int>::iterator iter = letterMap.begin();
while(iter != letterMap.end())
{
inMap.insert(std::pair<int, char>(iter->second, iter->first));
iter++;
}
// print(inMap);
std::vector<char> charVect;
std::map<int, char>::iterator iter1 = inMap.begin();
int frequence = iter1->first;
while(iter1 != inMap.end())
{
if(iter1->first > frequence)
{
break;
}
charVect.push_back(iter1->second);
iter1++;
}
// print(charVect);
std::string rtnStr;
int index = 0;
for(int j = 0; j < len; ++j)
{ //aabcdde
for(int i = 0; i < charVect.size(); ++i) //b c e
{
char c = charVect[i];
if(str[j] == c)
{
str[j] = '-';
}
}
}
for(int i = 0; i < strlen(str.c_str()); ++i)
{
if(str[i] != '-')
{
std::cout << str[i];
}
}
std::cout << std::endl;
}
int main()
{
std::string str;
getline(std::cin, str);
DeleteCharLess(str);
return 0;
}