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

来源:互联网 发布:淘宝一元包邮的店 编辑:程序博客网 时间:2024/06/10 11:28

题目描述

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

输入描述:

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

输出描述:

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

示例1

输入

abcdd

输出

dd

解题思路

考虑了两种方法。第一种比较常规,首先遍历一遍字符串,把每个字符的出现次数统计出来,连同字符本身一起存到数组里(为了方便查找字符,用的是unordered_map);然后再遍历一遍数组,找出最小出现次数;最后再遍历一遍数组,找出最小出现次数对应的字符,在字符串中将所有该字符删除。


第二种方法相对更简单一点。首先定义一个大小为26的数组,用来存26个小写字母出现的次数;然后遍历一遍字符串,把每个字符的出现次数统计出来,存在数组中;接着遍历一遍数组,找出最小出现次数;最后遍历一遍字符串,检查每个字符的出现次数,如果并非最小出现次数,则保留该字符。


第二种方法相比于第一种方法的简单之处在于,要删除一个字符,可能该字符在字符串中出现多次,删除比较麻烦。而保留字符则简单的多。另外,第一种方法需要一个哈希表存每个字符即可对应的出现次数,第二种方法只需要一个数组。


代码

#include <iostream>#include <string>#include <unordered_map>#include <vector>using namespace std;int main(){        string str;    while (cin >> str)    {                /* 删除出现最少的字符        unordered_map<char, int> charNumMap;        for (char ch: str) //记录每个字符出现的次数        {            charNumMap[ch]++;        }                int min = str.size();        for (auto iter = charNumMap.begin(); iter != charNumMap.end(); iter++) //找到最小值        {            if (min > (*iter).second)                min = (*iter).second;        }                char todel;         for (auto iter = charNumMap.begin(); iter != charNumMap.end(); iter++) //删除出现最少的字符        {            if (min == (*iter).second)            {                todel = (*iter).first; //待删除字符                                int begin = 0, index = 0;                while (begin < str.size() && str.find(todel, begin) != string::npos)                {                    index = str.find(todel, begin); //找到待删除字符位置                    str.erase(index, 1); //删除该字符                }            }        }                 cout << str << endl;         */                // 保留输出非最少的字符        vector<int> num(26); //记录26个字符的出现次数        for (char ch : str) //计算每个字符出现次数        {            num[ch - 'a']++;        }                int min = str.size();        for (int n : num) //找出最小出现次数        {            if (n != 0 && n < min)                min = n;        }                string str2;        for (char ch : str) //将出现次数非最小的字符存下来        {            if (num[ch - 'a'] != min)                str2 += ch;        }                cout << str2 << endl;    }        return 0;}