1. 程式人生 > >Leetcode451. 對字元出現頻率進行排序

Leetcode451. 對字元出現頻率進行排序

Leetcode451. Sort Characters By Frequency

題目

Given a string, sort it in decreasing order based on the frequency of characters.

Example 1:
Input: “tree”
Output: “eert”
Explanation:
‘e’ appears twice while ‘r’ and ‘t’ both appear once.
So ‘e’ must appear before both ‘r’ and ‘t’. Therefore “eetr” is also a valid answer.

Example 2:
Input: “cccaaa”
Output: “cccaaa”
Explanation:
Both ‘c’ and ‘a’ appear three times, so “aaaccc” is also a valid answer.
Note that “cacaca” is incorrect, as the same characters must be together.

Example 3:
Input: “Aabb”
Output: “bbAa”
Explanation:
“bbaA” is also a valid answer, but “Aabb” is incorrect.
Note that ‘A’ and ‘a’ are treated as two different characters.

解題分析

通過上面幾個例子我們可以發現,題目要求我們按照字元出現頻率從高到低進行排序,大小寫區分。看到字元出現頻率,很自然地就想到用unordered_map雜湊表來儲存每個字元出現的次數。然後通過對整個雜湊表進行排序,最後將其進行輸出。
但是這裡有一個問題,就是stl的sort演算法只能對線性序列容器進行排序(即vector,list,deque)。所以我們這裡就要設法將儲存在雜湊表裡面的內容轉移到vector這些容器中了。這裡由於雜湊表儲存的是key-value對,所以vector應該宣告成pair某種模板型別,這樣在vector中才能通過value找到相對應的key值。
在將鍵值對全部插入到vector之後,就要對value值進行排序了。stl的sort函式有三個引數,其中第三個引數是可選的,是一個返回值型別可轉化為bool的函式,表示sort的方式。如果我們不傳入第三個引數,那麼sort完成後輸出的結果就是按ascii值從小到大進行排序的結果。因此,在這裡有必要傳入第三個引數。
這裡用到了c++11的lambda表示式,它是一種函數語言程式設計的寫法,其中[]表示要捕獲的內容,()表示函式傳入的引數。這裡函式體內容就很簡單了,只需比較兩個引數對應的value值,這樣我們就確定了sort排序的方式,問題就解決了。

原始碼

class Solution {
public:
    string frequencySort(string s) {
        string str = "";
        unordered_map<char, int> iMap;
        vector<pair<char, int>> vtMap;
        for (int i = 0; i < s.size(); i++) {
            iMap[s[i]]++;
        }
        for (auto it = iMap.begin(); it != iMap.end(); it++) {
            vtMap.push_back(make_pair(it->first, it->second));
        }
        sort(vtMap.begin(), vtMap.end(), [](const pair<int, int>& x, const pair<int, int>& y) -> int {
            return x.second > y.second;
        });
        for (auto it = vtMap.begin(); it != vtMap.end(); it++) {
            for (int i = 0; i < it->second; i++) {
                str += it->first;
            }
        }
        return str;
    }
};

以上是我對這道問題的一些想法,有問題還請在評論區討論留言~