zoukankan      html  css  js  c++  java
  • 451. 根据字符出现频率排序

    451. 根据字符出现频率排序

    给定一个字符串,请将字符串里的字符按照出现的频率降序排列。

    示例 1:

      输入:
      "tree"

      输出:
      "eert"

    解释:
    'e'出现两次,'r'和't'都只出现一次。
    因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。
    示例 2:

      输入:
      "cccaaa"

      输出:
      "cccaaa"

    解释:
    'c'和'a'都出现三次。此外,"aaaccc"也是有效的答案。
    注意"cacaca"是不正确的,因为相同的字母必须放在一起。
    示例 3:

      输入:
      "Aabb"

      输出:
      "bbAa"

    解释:
    此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。
    注意'A'和'a'被认为是两种不同的字符。

     

    思路一:利用vector自定义排序

    1. 使用无序map存储字符和出现次数映射关系
    2. 在vector中存储pair对,利用vector自定义排序
    #include<iostream>
    #include<vector>
    #include<bits/stdc++.h>
    #include<map>
    #include<cstring>
    using namespace std;
    bool cmp(const pair<char,int>& p1,const pair<char,int>& p2){
        return p1.second>p2.second;
    }
    class Solution{
    public:
    
        string frequencySort(string s) {
            map<char,int>ump;
            int len=s.length();
            for (int i = 0; i < len; i++)
            {
                ++ump[s[i]];
            }
            vector<pair<char,int> > vec;
            for(map<char,int>::iterator it=ump.begin();it!=ump.end();it++){
                vec.push_back(*it);
                // cout<<it->first<<" "<<it->second<<endl;
            }
            sort(vec.begin(),vec.end(),cmp);
            len=vec.size();
            string ret;
            for (int i = 0; i < len; i++)
            {
                ret+=string(vec[i].second,vec[i].first);
            }
            return ret;
        }
    
    };
    int main(){
        Solution solution;
        string str="Aabb";
        cout<<solution.frequencySort(str);
    
    }

     

    思路二:优先队列

    class Solution {
    public:
        string frequencySort(string s) {
            unordered_map<char, int> ump;
            for (const auto &c : s) {
                ++ump[c];
            }
            priority_queue<pair<int, char>> pq;
            for (const auto &m : ump) {
                pq.push({m.second, m.first});
            }        
            string ret;
            while (!pq.empty()) {
                auto t = pq.top(); 
                pq.pop();
                ret.append(t.first, t.second);
            }
            return ret;
        }
    };

    思路三:利用lambda自定义排序

    class Solution {
    public:
        string frequencySort(string s) {
            unordered_map<char, int> ump;
            for (const auto &c : s) {
                ++ump[c];
            }
            sort(s.begin(), s.end(), [&](char &a, char &b) { return ump[a] > ump[b] || (ump[a] == ump[b] && a < b); });
            return s;
        }
    };

    思路四:数组下标索引

    每个字符出现次数不会超过字符串s长度,将字符添加到字符出现次数对应数组下标处,然后从后向前遍历,如果对应下标不为空,则添加到结果集中。

    class Solution {
    public:
        string frequencySort(string s) {
            unordered_map<char, int> ump;
            for (const auto &c : s) {
                ++ump[c];
            }
            vector<string> vec(s.size() + 1);
            string res;
            for (const auto &m : ump) {
                vec[m.second].append(m.second, m.first);
            }
            for (int i = s.size(); i > 0; --i) {
                if (!vec[i].empty()) {
                    res.append(vec[i]);
                }
            }
            return res;
        }
    };

     

    因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/13536402.html

  • 相关阅读:
    vue中computed计算属性和methods区别
    java解决跨域问题
    redis服务端开启
    使用excel生成商品条形码
    MySQL主键自增时SQL写法/当前时间写法
    修改MySQL数据库密码
    MySQL5.6.42解压版安装教程
    完全卸载MySQL数据库
    IDEA快捷键及xml文件中网址报错
    IDEA导入外部包
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/13536402.html
Copyright © 2011-2022 走看看