49.Group Anagrams

给定一个字符串容器,对这些字符串进行分类,是字符的分为一类,返回分类结果。

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

思路:
暴力法,此题是easy-242题 Valid Anagram 的升级版,将容器中的字符串遍历,并将每一个字符串与模板中的比较,若和模板中的字符串成为字谜,则将其加入到结果中,否则,添加到模板中,而在于模板中保存的模板挨个比较的时候,就用到了242题判断连个字符串是否是字谜的方法。虽然能AC,但是很慢,只比5%的提交快。

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>> res;
        vector<string> tmplate;
        for (int i = 0; i < (int)strs.size(); i++) {//遍历容器中的字符串
            bool flag = false;
            string tmp_s = strs[i];
            for (int j = 0; j < (int)tmplate.size(); j++) {//遍历模板容器
                if (tmplate[j].size() != tmp_s.size()) continue;//首先判断长度是否一样
                flag = true;
                int tmp[26] = { 0 }; //开始比较两个字符串是否成为字谜
                for (int k = 0; k < (int)tmp_s.size(); k++) {
                    tmp[tmplate[j][k] - 'a'] += 1;
                    tmp[tmp_s[k] - 'a'] -= 1;
                }
                for (auto a : tmp) {
                    if (a != 0) {
                        flag = false; break;
                    }
                }
                if (flag) { res[j].push_back(tmp_s); break; }//若是字谜,则加入到结果中
            }
            if (flag == false) {//与模板中都不成为字谜,或者模板为空,则添加当前字符串到模板中
                tmplate.push_back(tmp_s);
                res.push_back({ tmp_s });
            }
        }
        return res;
    }
};

二、将字谜都转为字母 + 出现个数的组合,比如:“ate”/"tea" 都转为“a1e1t1”,这对于不同的字谜,具有绝对区分度。再利用哈希字典存储字符串容器。

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>> res;
        unordered_map<string, vector<string>> map;
        for (int i = 0; i < (int)strs.size(); i++) {
            string tmp;
            int a[26] = { 0 };
            for (auto c : strs[i]) a[c - 'a'] += 1;
            for (int j = 0; j < 26; j++) {
                if (a[j] == 0) continue;
                tmp += string(1, 'a' + j) + to_string(a[j]);
            }
            map[tmp].push_back(strs[i]);
        }
        for (auto item : map) res.push_back(item.second);
        return res;
    }
};

Java 版:

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> map = new HashMap<>();
        for(String s : strs){
            int[] tmp = new int[26];
            for(int i = 0; i < s.length(); i++){
                tmp[s.charAt(i) - 'a']++;
            }
            String key = "";
            for(int i = 0; i < 26; i++){
                if(tmp[i] > 0) key = key + tmp[i] + (char)(i + 'a');
            }
            if(map.containsKey(key)){
                List<String> tmpString = map.get(key);
                tmpString.add(s);
            }else map.put(key, new ArrayList<String>(Arrays.asList(s)));
        }
        return new ArrayList<>(map.values());
    }
}
原文地址:https://www.cnblogs.com/luo-c/p/12980324.html