leetcode49 字母异位词分组
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出:
[
[“ate”,“eat”,“tea”],
[“nat”,“tan”],
[“bat”]
]
解题思路与代码思路:
在写代码的时候,发现难点在于对哈希表和python字典的运用,以及列表中的列表的拆解。写代码或思考时,最好在纸张上画一下
排序法
排序是对列表中的每个字符串做排序,异位词排完序后是相等的,可以把这个值作为key值放入字典,然后把共同的异位词都放在一个列表中作为value。在代码实现时,有两个重点:
- sorted(‘str’)得到的结果是列表,因为key值必须是不可变类型,所以要把列表转化为tuple
- 我们该如何把value存放为列表呢?
ans = collections.defaultdict(list)
,这是一种方法,可以把value值看作list,不过需要导包。例外一种方法就是dict[key] = dict.get(key, []) + [item]
,get方法是获取key对应的值,若不存在就返回default=[],我们这里设置为列表,然后把需要添加的元素以列表形式相加即可。
字典获取value值得的类型是dict_values,最后需要返回的dict.values要转回list
计数法
其实这个方法与上一个的形式很相似,只是把key值用计数的方式存储。利用只有26个小写字母的特点,可以使用ascii码作为key,字母的计数作为value。使用与上面同样的方式返回正确答案
代码:
排序法
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
dict = {}
for item in strs:
key = tuple(sorted(item))
dict[key] = dict.get(key, []) + [item]
return list(dict.values())
计数法
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
res = {}
for i in strs:
new_str = [0]*26
for j in i:
new_str[ord(j)-ord('a')] +=1
key = tuple(new_str)
res[key] = res.get(key,[])+[i]
return list(res.values())
复 杂 度 分 析 : \color{red}{复杂度分析:} 复杂度分析:
- 排序法
- 时间复杂度: O(NKlogK),N是列表长度,K是strs中字符串长度最大的值
- 空间复杂度:O(NK),排序存储在字典的空间,有N次,每次最大存储为K
- 计数法:
- 时间复杂度:O(NK)
- 空间复杂度:O(NK)