Bootstrap

【leetcode hot 100 49】字母异位词分组

一、错误思路:在判断是否str[i]的每一个字母都存在于str[j]中

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        List list = new ArrayList();
        Map<Integer,Integer> map = new HashMap(); // 用map存放记录已经查找到的str
        for(int i=0; i<strs.length; i++){
            if (map.containsKey(i)){
                continue;//改str已经被查找过了
            }
            // 对每一个string进行查找
            List list_tmp = new ArrayList();
            list_tmp.add(strs[i]);
            for(int j=i+1; j<strs.length; j++){
                // 从每一个string的后面一个开始查找
                if(strs[i].length() != strs[j].length()){
                    continue;
                }
                int k=0;
                for(; k<strs[i].length(); k++){
                    char c = strs[i].charAt(k);
                    if (strs[j].indexOf(c) == -1){
                        break; //str[j]中没有str[i]的第k个字母
                    }
                }
                if (k==strs[i].length() || (strs[i].length()==0 && strs[j].length()==0)){// str[i]和str[j]字母异位词
                    list_tmp.add(strs[j]);
                    // 记录strs[j]已经被查找过了,后续不需要再查找
                    map.put(j,0);
                }
            }
            list.add(list_tmp);
        }
        return list;
    }
}

注意:

  • 数组的长度通过length计算,String的长度通过length()计算
  • 注意continue(结束本次循环)和break(结束此循环)的区别
  • String中charAt()indexOf()函数的使用

错误原因:未考虑有相同字母但是数量不同的情况在这里插入图片描述

二、正确解法:初始化一个哈希表 map,其中键是排序后的字符串,值是对应的异位词列表(ArrayList)。

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        // String是排序后的String,List是排序后=key的原始String(用于直接返回)
        Map<String, List<String>> map = new HashMap<>();
        
        for(String str:strs){
            // 排序string的字母
            char[] tmp_chars = str.toCharArray();
            Arrays.sort(tmp_chars);
            String sort_str = new String(tmp_chars);

            // 将排序后的string放入map中
            if (!map.containsKey(sort_str)){
                map.put(sort_str,new ArrayList());
            }

            // 把未排序的string放入map的list中
            map.get(sort_str).add(str);
        }
        
        return new ArrayList<>(map.values());
    }
}

注意:

  • String转换为char数组:char[] chars = str.toCharArray()
  • char数组转换为String:String str = new String(chars)
  • char数组排序:用数组Arrays类实现Arrays.sort(chars)
  • 把未排序的string放入map的list中:map.get(sort_str).add(str)
;