49. 字母异位词分组

题干

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

 

示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例
2: 输入: strs = [""] 输出: [[""]]
示例
3: 输入: strs = ["a"] 输出: [["a"]]

 

 

提示:

  • 1 <= strs.length <= 104
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

 

思路1:直接模拟过程

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> res = new ArrayList<>();
        Set<Integer> skipSet = new HashSet<>();
        for(int i=0;i<strs.length;i++){
            if(skipSet.contains(i)){
                continue;
            }
            List<String> singleRes = new ArrayList<>();
            singleRes.add(strs[i]);
            Map<Character,Integer> count = new HashMap<>();
            for(int j=0;j<strs[i].length();j++){
                char c = strs[i].charAt(j);
                count.put(c,count.getOrDefault(c,0)+1);
            }
            if(i+1<strs.length){
                for(int j=i+1;j<strs.length;j++){
                    Map<Character,Integer> target = new HashMap<>();
                    for(int k=0; k<strs[j].length();k++){
                        char c = strs[j].charAt(k);
                        target.put(c, target.getOrDefault(c,0)+1);
                    }
                    if(count.equals(target)){
                        singleRes.add(strs[j]);
                        skipSet.add(j);
                    }
                }
            }
            res.add(singleRes);
        }
        return res;
    }
}

结果:

 提交之后发现问题:

 

思路2:字符串提前排序

先把每个string内部按照a-z排序,然后再把排完序后的string来匹配就能够快些了

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String,List<String>> map = new HashMap<>();
        for(int i=0;i<strs.length;i++){
            char[] chs = strs[i].toCharArray();
            Arrays.sort(chs);
            String key = String.valueOf(chs);
            if(map.containsKey(key)){
                List<String> list = map.get(key);
                list.add(strs[i]);
                map.put(key,list);
            }
            else{
                List<String> list = new ArrayList<String>();
                list.add(strs[i]);
                map.put(key, list);
            }
        }
        List<List<String>> res = new ArrayList<>();
        for(Map.Entry<String, List<String>> entry:map.entrySet()){
            List<String> singleList = entry.getValue();
            res.add(singleList);
        }
        return res;
    }
}

 

 

posted @ 2024-04-06 16:54  Heinrich♣  阅读(26)  评论(0编辑  收藏  举报