leetcode(力扣) 49. 字母异位词分组 (哈希表)

文章目录

  • 题目描述
  • 思路分析
  • 完整代码

题目描述

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。

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

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

示例 3:
输入: strs = [“a”]
输出: [[“a”]]

思路分析

仔细看输入和输出,输出将 [“ate”,“eat”,“tea”] 这三个归为一类,可以发现,在筛选成为一组的时候其实可以无视他们每个单词的字母顺序,也就是说, ate eat tea 都是 aet 这三个字母组成。

所以可以将输入进行排序然后将相同的归到一类,比如示例1 strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 分别对每个单词进行排序后为 [‘aet’, ‘aet’, ‘ant’, ‘aet’, ‘ant’, ‘abt’], 相同的单词将在答案中归为一组,显然 下标0 1 3为一组 2 4为一组 5为一组,但是答案返回的是原单词,所以这里排序之后归组时需要纪录下标。

使用哈希表记录下标,key为字母 val为下标,则该示例中 造的哈希表是 {‘aet’: [0, 1, 3], ‘ant’: [2, 4], ‘abt’: [5]}。

有了这个哈希表之后,遍历分组就行了。

完整代码

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        temp = []
        res = []
        for i in strs:
            a = list(i)
            a.sort()
            temp.append(''.join(a))
        hs = {}
        for idx,val in enumerate(temp):
            if val in hs:
                hs[val] = hs[val] + [idx]
            else:
                hs[val] = [idx]
        for j in hs:
            ans = []
            for k in hs[j]:
                ans.append(strs[int(k)])
            res.append(ans)
        return res

你可能感兴趣的:(个人笔记,交流学习,leetcode,python)