字母异位词分组(力扣100
1.使用哈希存一个字符串的模板信息,即一个字符串出现的每个单词及其次数,并将这个消息转为一个字符串以便于比较
2.遍历strs,若为同一个模板,则加入
class Solution(object):
def hash_count(self,str):
hash_map={}
for i,value in enumerate(str):
if value in hash_map.keys():
hash_map[value]+=1
else:
hash_map[value]=1
return hash_map
def hash_to_str(self,hash):
l=[]
for v in hash.keys():
l.append([ord(v),hash[v]])
l.sort(key=lambda x: x[0])
str1=""
for x in l:
str1+=chr(x[0])+str(x[1])
return str1
def groupAnagrams(self, strs):
"""
:type strs: List[str]
:rtype: List[List[str]]
"""
hash_map={}
answer=[]
for i,value in enumerate(strs):
hash_i=self.hash_count(value)
str_i=self.hash_to_str(hash_i)
if str_i in hash_map:
hash_map[str_i].append(value)
else:
hash_map[str_i]=[]
hash_map[str_i].append(value)
for v in hash_map.keys():
answer.append(hash_map[v])
return answer
不熟的基本知识:
数字变字符串str()
列表变字符串" ".join(l)
列表就地排序l.sort(key=lambda x:x[0]) 其实不止是数字,字母也是可以排序的,所以ord和chr其实没有必要
生成新列表new_l=sorted(l,key=lambda x: x[0]) 这个所有可迭代的都可以排序,但是注意返回的是列表,也就是说字符串排序是会返回列表的,需要再join一下
字母变数字 ord()
数字变回字母 chr()
更简单的写法,字符串可以直接排序,不需要手写一个字符串的模板信息
没想到这个就是因为对于语法还不熟悉
注意不可变的才能做字典的键,列表不行,元组可以
更优的解法:
class Solution(object): def groupAnagrams(self, strs): """ :type strs: List[str] :rtype: List[List[str]] """ mp=collections.defaultdict(list) for st in strs: key="".join(sorted(st)) mp[key].append(st) return list(mp.values())