编写一种方法,对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。
注意:本题相对原题稍作修改
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
一、位表示(不考虑有重复字母)
每个字符串用一个26位的二进制数来表示用了哪些字母。
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
if len(strs) == 0:
return [[]]
if len(strs) == 1:
return [[strs[0]]]
helper = []
ans = []
for i in range(0, len(strs)):
t = 0
for j in strs[i]:
t += (1<<(ord(j) -ord('a')))
if t not in helper:
helper.append(t)
ans.append([strs[i]])
else:
ans[helper.index(t)].append(strs[i])
return ans
二、字符串排序
把每个字符串按字母顺序排序。
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
if len(strs) == 0:
return [[]]
if len(strs) == 1:
return [[strs[0]]]
helper = []
ans = []
for i in range(0, len(strs)):
l = list(strs[i])
l.sort()
t = "".join(l)
if t not in helper:
helper.append(t)
ans.append([strs[i]])
else:
ans[helper.index(t)].append(strs[i])
return ans
改进简洁版:
用字典保存排序后保存在字典里。
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
classes = dict()
for s in strs:
sort_s = ''.join(sorted(s))
classes[sort_s] = classes.get(sort_s, []) + [s]
return [vals for vals in classes.values()]