算法初探LeetCode-字母异位词分组

109 阅读1分钟

字母异位词分组

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

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。

  示例 1:

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

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]

提示:

  • 1<=strs.length<=1041 <= strs.length <= 10^4
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

思路分析

两个字符串互为字母异位词,当且仅当两个字符串包含的字母相同。同一组字母异位词中的字符串具备相同点,可以使用相同点作为一组字母异位词的标志,使用哈希表存储每一组字母异位词,哈希表的键为一组字母异位词的标志,哈希表的值为一组字母异位词列表。

比较字符串是否相同,可以先将字符串排序:先用 char[] ch=s.toCharArray(); 转成字符数组,再用 Arrays.sort(ch); 进行排序。最后用键来判断是否有这个键,如果有就相同。

放在一起,可以用map.put(key,new ArrayList<>()); 构建一个集合 ,再用map.get(key).add(s);将需要放在一起的放进集合

需要找到的是由相同字母组成的单词 那这样的单词经过排序之后都是一样的字母,可以形成一个标识即为key 用HashMap存储key,value为相同字母单词的list 最后输出map里所有的value就是要的结果

需要了解一下java中map和list的特性 map是一个key对应一个value,不重复 list可以重复,所以就算有重复的单词也没事

算法代码

public List < List < String >> groupAnagrams(String[] strs) {
    HashMap < String, List < String >> map = new HashMap < String, List < String >> ();
    for (String str: strs) {
        char[] strCh = str.toCharArray();
        Arrays.sort(strCh);
        String key = new String(strCh);
        List < String > list = map.getOrDefault(key, new ArrayList < String > ());
        list.add(str);
        map.put(key, list);

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

结果详情

nxy.png

算法复杂度

  • 空间复杂度:O(1)O(1)
  • 时间复杂度:O(n)O(n)

掘金(JUEJIN)一起进步,一起成长!