我的思路:
结构体 最终以结构体的思路用列表实现
我的代码:
def groupAnagrams(self, strs):
"""
:type strs: List[str]
:rtype: List[List[str]]
"""
tmplist=[] # tmplist用来存储原字符串和排序后的字符串
littlelist=[] # littlelist用来存储最终返回的列表中的小列表
ans=[] # ans用来存储最后要返回的列表
for i in strs:
# wordlist是每个字符串中的字母排序后的列表(对字符串排序生成的是列表)
# 并将这个列表转换成字符串
# 将新生成的字符串和原来的字符串存入tmplist列表
wordlist=sorted(i)
newword=''
for j in wordlist:
newword=newword+j
tmplist.append([newword,i])
# 对生成的tmplist列表排序 这样包含相同字母的字符串就会排列在一起
# 存在sortedtmp中 并在最后加上end作为结束标记
sortedtmp=sorted(tmplist)
sortedtmp.append('end')
# 对sortedtmp中的新字符串进行判断
# 若当前的新字符串和前面的新字符串一样 代表这两个列表的原字符串包含的字母是一样的 将他们加入同一个列表littlelist
# 若当前的新字符串和前面的新字符串不同 代表这两个列表的原字符串包含的字母是不同的 将之前字母都相同的字符串列表littlelist加入到ans中 并清空littlelist
for i in range(1,len(sortedtmp)):
if sortedtmp[i][0]==sortedtmp[i-1][0]:
littlelist.append(sortedtmp[i-1][1])
else:
littlelist.append(sortedtmp[i-1][1])
ans.append(littlelist)
if sortedtmp[i]=='end':
break
littlelist=[]
return ans
以上代码实现起来繁琐
- 不仅要对字符串排序 还要将排序后的列表转换成新的字符串
- 对生成的新列表再次排序
优秀题解:
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())
item= eat
key= ('a', 'e', 't')
dict[key]= ['eat']
item= tea
key= ('a', 'e', 't')
dict[key]= ['eat', 'tea']
item= tan
key= ('a', 'n', 't')
dict[key]= ['tan']
....
最终的dict:
{('a', 'e', 't'): ['eat', 'tea', 'ate'], ('a', 'n', 't'): ['tan', 'nat'], ('a', 'b', 't'): ['bat']}
所以输出的是dict.values()