题目:
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i]
仅包含小写字母
自己第一次写的时候超时了
strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
standard = []
end = [] #用来存放最终的结果
temp = [] #临时列表
for i in strs:
if sorted(list(i)) not in standard:
standard.append(sorted(list(i)))
for i in standard:
for j in strs:
if sorted(list(j)) == i:
temp.append(j)
end.append(temp)
temp = []
print(sorted(end,key=lambda x:len(x)))
又写的一个不叫不错的方法:
strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
table = {}
for s in strs:
s_ = "".join(sorted(s))
if s_ not in table:
table[s_] = [s]
else:
table[s_].append(s)
print(list(table.values()))
但是时间和空间都不太占有优势又在外网的力扣中看到了一个比较厉害的方法
# 在美版leetcode上看到大神的思路,
# 用质数表示26个字母,把字符串的各个字母相乘,
# 这样可保证字母异位词的乘积必定是相等的。
# 其余步骤就是用map存储。(python实现,耗时56ms)
strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
map = {
'a':2,'b':3,'c':5,'d':7,'e':11,'f':13,'g':17,'h':19,'i':23,'j':29,'k':31,'l':37,'m':41,
'n':43,'o':47,'p':53,'q':59,'r':61,'s':67,'t':71,'u':73,'v':79,'w':83,'x':89,'y':97,'z':101
}
resmap={}
reslist = []
for str in strs:
m = 1
for i in range(len(str)):
m *= map[str[i]] #计算字符串每个字母所对应质数的乘积
if not m in resmap: #如果不存在的话,将字典的键为m,键值为[]
resmap[m] = []
resmap[m].append(str)
print([j for j in resmap.values()])