Leetcode专题之 哈希表

132 阅读1分钟

在刷双指针和滑动窗口的题,结果做到了一道贪心和一道哈希表 究竟是谁分类的哼

  1. 49. Group Anagrams

Given an array of strings strs, group the anagrams together. You can return the answer in any order.

An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the original letters exactly once.

 

Example 1:

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

Example 2:

Input: strs = [""]
Output: [[""]]

Example 3:

Input: strs = ["a"]
Output: [["a"]]

总结一下,就是把含有相同字母的string组合在一起。

我最开始的想法是把每一个字符串都排序,排序前的字符串是original,排序后的字符串是sorted,然后放在一个数据结构里:List<original, sorted>,之后讲list通过sorted字段进行排序,排序之后,从头到尾遍历,如果后面sorted字符串和前面的sorted字符串相同,则把两边的original字符串放在一起,最终得到结果

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> res = new ArrayList<>();
        List<String[]> list = new ArrayList<>();
        for(int i = 0; i < strs.length; i++) {
            String original = strs[i];
            char[] chars = original.toCharArray();
            Arrays.sort(chars);
            String sorted = new String(chars);
            list.add(new String[]{sorted, original});
        }

        Collections.sort(list, (a, b) -> a[0].compareTo(b[0]));
        for(int i = 0; i < list.size(); i++) {
            if (i > 0 && list.get(i)[0].equals(list.get(i-1)[0])) {
                List<String> item = res.get(res.size() - 1);
                item.add(list.get(i)[1]);
            } else {
                List<String> item = new ArrayList<>();
                item.add(list.get(i)[1]);
                res.add(item);
            }
        }

        return res;     
    }
}

击败34.90%的选手

更好的解法就是用map来做,创建一个Map<String, List>,前面的string是sorted,后面就是放所有original的list,每遍历一个字符串,就通过sorted拿到对应的list然后把original加进去,这样效率会更高

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> res = new ArrayList<>();
        Map<String, List<String>> map = new HashMap<>();
        for(int i = 0; i < strs.length; i++) {
            String original = strs[i];
            char[] charArray = original.toCharArray();
            Arrays.sort(charArray);
            String sorted = new String(charArray);

            List<String> sameList = map.getOrDefault(sorted, new ArrayList<>());
            sameList.add(original);
            map.put(sorted, sameList);
        }

        return new ArrayList<List<String>>(map.values());
    }
}