一、题设
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
二、基本思路
1.我直接暴力+字典,穷举出用i下标下的词的字母异位词,同样的就加入列表中:
def groupAnagrams(self,strs):
lens = len(strs)
res = []
flag = [0 for _ in range(lens)]
for i in range(lens): # 遍历每个元素
if flag[i] == 0:
tmp = []
dic1 = {}
tmp.append(strs[i])
flag[i] = 1
# 给str[i]生成字典
for j in range(len(strs[i])):
item = strs[i][j]
dic1[item] = dic1.get(item, 0) + 1
for j in range(i + 1, lens):
if flag[j] == 0:
# 给str[j]生成字典
dic2 = {}
for k in range(len(strs[j])):
item = strs[j][k]
dic2[item] = dic2.get(item, 0) + 1
if dic1 == dic2:
tmp.append(strs[j])
flag[j] = 1
res.append(tmp)
return res
运行结果超时:
2.于是我便想着能否简化,我想到collection中的counter的方法,也是用字典去计数,我想着封装的方法可能写的效率会比我高一些,于是:
def groupAnagrams(self,strs):
from collections import Counter
lens = len(strs)
res = []
flag = [0 for _ in range(lens)]
for i in range(lens): # 遍历每个元素
if flag[i] == 0:
tmp = []
tmp.append(strs[i])
flag[i] = 1
dic1 = Counter(strs[i])
for j in range(i + 1, lens):
if flag[j] == 0:
# 给str[j]生成字典
dic2 = Counter(strs[j])
if dic1 == dic2:
tmp.append(strs[j])
flag[j] = 1
res.append(tmp)
return res
结果只是单纯代码量变短了,运行效果没啥变化:
3.接着我想这在思路上能不能有啥变化,想想字典收集元素个数能不能换种方法替代一下,排序,排序成字典序就是一样的数了,直接==比较就完了,也就少了开辟字典和遍历字典的时间空间,代码如下:
def groupAnagrams(self,strs):
res = []
flag = [0 for _ in range(len(strs))]
for i in range(len(strs)):
if flag[i] == 0:
tmp = []
object1 = sorted(strs[i])
flag[i] = 1
tmp.append(strs[i])
for j in range(i+1,len(strs)):
if flag[j] == 0:
object2 = sorted(strs[j])
if object1 == object2:
flag[j] = 1
tmp.append(strs[j])
res.append(tmp)
return res
emmm....
4.最后看题解用了collections的defaultdict方法:也就是用defaultdict方法生成一个mp列表,这一列表若没有元素则用list元素填充,具体用法可以参考:from collections import defaultdict 的用法,将排序后的值作为key,然后将每个数排序后加入key值的value中,最后返回字典的元素即可。我只能说这题学了个方法...
class Solution(object):
def groupAnagrams(self,strs):
from collections import defaultdict
mp = defaultdict(list)
for item in strs:
key = "".join(sorted(item))
mp[key].append(item)
return mp.values()