49.Group Anagrams同字符詞語分組

49.Group Anagrams同字符詞語分組

1 描述

Given an array of strings, group anagrams together.

Example:

Input: ["eat", "tea", "tan", "ate", "nat", "bat"],
Output:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

2 思路

  1. 建立hash表,依次取數組中的值存入瞬時變量,然後對變量進行排序,最後將排序後的結果作爲key值,原始結果作爲value,最後將同一個key值得元素全部取出。

  2. 方法2對方法一中的key值做出了調整,採用26個字符轉爲key,具體如下

    ​ [a, b, c, d, e, …., t,…,z]

    編碼:[1, 0, 0, 0, 1,…, 1,…,0] => eat, tea, ate

    ​ [a, b, c, …, n, …., t,…,z]

    編碼:[1, 0, 0,…, 1,…, 1,…,0] => tan, nat

3 C++

  • 方法一
class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>> result;
        map<string, vector<string>> anagram;

        for(int i=0; i<strs.size(); i++) {
            string str = strs[i];
            sort(str.begin(), str.end());

            if(anagram.find(str) == anagram.end()) {
                vector<string> item;
                anagram[str] = item;
            }
            anagram[str].push_back(strs[i]);
        }

        map<string, vector<string>>::iterator it;
        for(it = anagram.begin(); it != anagram.end(); it++) {
            result.push_back((*it).second);
        }
        return result;
    }
};
  • 方法二
class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>> result;
        map<vector<int>, vector<string>> anagram;

        for(int i=0; i<strs.size(); i++) {
            vector<int> vec;
            str_to_vector(strs[i], vec);

            if(anagram.find(vec) == anagram.end()) {
                vector<string> item;
                anagram[vec] = item;
            }
            anagram[vec].push_back(strs[i]);
        }

        map<vector<int>, vector<string>>::iterator it;
        for(it = anagram.begin(); it != anagram.end(); it++) {
            result.push_back((*it).second);
        }
        return result;
    }
private:
    void str_to_vector(string &str, vector<int> & vec) {
        for(int i=0; i<26; i++) {
            vec.push_back(0);
        }

        for(int i=0; i<str.length(); i++) {
            vec[str[i] - 'a'] ++;
        }
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章