美文网首页
LeetCode49. Group Anagrams

LeetCode49. Group Anagrams

作者: 24K纯帅豆 | 来源:发表于2019-05-10 17:25 被阅读0次

    1、题目链接

    https://leetcode.com/problems/group-anagrams/

    2、解题思路

    这道题的意思是给你一个字符串数组,让你把含有相同字符的字符串(不考虑字符的顺序)进行分组,一开始我的想法是遍历整个数组,然后将每个字符串按照字典序排序,然后再把分组中的字符串按照字典序排序,最后比较两个字符串,如果相同就把他加到该组当中,如果不相同那就新建分组,毫无疑问这样做是能实现的,但是TLE(Time Limit Exceed)了,既然超时了,那就找找原因呗,排序可能会导致,两个for循环也可能会导致,刚开始除了两个for循环我还真没想到什么好的方法,然后我就考虑将排序给干掉,能不能不排序就知道两个字符串的字符想不相同呢?那肯定是有的了,按照以往的经验,碰到这种明目张胆提示了你只有小写字母(26个字符)的,那就肯定是要逼你用一个int数组来保存字符串中某个字符出现的次数,但是很不幸,又超时了,WTF,后来想到HashMap中的key是不能重复的,这不正好和我们的结果是一样的吗,key就是我们结果中的每一组的共同点(开头我们说过,字典序是一样的),所以,又要排序吗?NO,刚去掉的排序我不能自己打自己的脸>_<,最后还是借助我们的字符数组来完成这一操作了(其实我觉得这么做的结果也是排序,真香系列),是不是又多了一种字典序排列的方法。

    3、代码

    • Java
    private static List<List<String>> groupAnagrams(String[] strs) {
        if (null == strs) return null;
        List<String> list;
        Map<String, List<String>> mapList = new HashMap<>();
        for (String s : strs) {
            int[] chArray = new int[26];
            for (int i = 0; i < s.length(); i++) {
                chArray[s.charAt(i) - 97]++;
            }
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < chArray.length; i++) {
                int chCount = chArray[i];
                while (chCount > 0) {
                    sb.append((char) i + 97);
                    chCount--;
                }
            }
            String key = sb.toString();
            if (mapList.containsKey(key)) {
                mapList.get(key).add(s);
            } else {
                list = new ArrayList<>();
                list.add(s);
                mapList.put(key, list);
            }
        }
        return new ArrayList<>(mapList.values());
    }
    
    • Python
    def groupAnagrams(self,strs):
        resultMap = {}
    
        for str in strs:
            chArray = [0] * 26
            for ch in str:
                chArray[ord(ch) - 97] += 1
            key = ""
            for index in range(len(chArray)):
                count = chArray[index]
                while count > 0:
                    key += chr(index + 97)
                    count -= 1
            if resultMap.has_key(key):
                resultMap.get(key).append(str)
            else:
                resultMap[key] = [str]
        return resultMap.values()
    
    • JavaScript
    /**
     * @param {string[]} strs
     * @return {string[][]}
     */
    var groupAnagrams = function(strs) {
        let resultMap = {};
        for (let j = 0; j < strs.length; j++) {
            let chArray = new Array(26);
            chArray.fill(0);
            for (let i = 0; i < strs[j].length; i++) {
                chArray[strs[j].charAt(i).charCodeAt() - 97]++;
            }
            let key = ""
            for (let i = 0; i < chArray.length; i++) {
                let count = chArray[i]
                while (count > 0) {
                    key += String.fromCharCode(i + 97)
                    count--
                }
            }
            if (resultMap.hasOwnProperty(key)) {
                resultMap[key].push(strs[j])
            } else {
                resultMap[key] = [strs[j]]
            }
        }
        let resultList = []
        for (let key in resultMap) {
            resultList.push(resultMap[key])
        }
        return resultList
    };
    

    4、提交结果

    image

    相关文章

      网友评论

          本文标题:LeetCode49. Group Anagrams

          本文链接:https://www.haomeiwen.com/subject/tnfboqtx.html