给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 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] 仅包含小写字母
这道题让我们群组给定字符串集中所有的异位词,所谓的异位词就是两个字符串中字母出现的次数都一样,只是位置不同,比如 abc,bac, cba 等它们就互为异位词,那么如何判断两者是否是异位词呢,可以发现如果把异位词的字符顺序重新排列,那么会得到相同的结果,所以重新排序是判断是否互为异位词的方法,由于异位词重新排序后都会得到相同的字符串,以此作为 key,将所有异位词都保存到字符串数组中,建立 key 和当前的不同的异位词集合个数之间的映射,这里之所以没有建立 key 和其隶属的异位词集合之间的映射,是用了一个小 trick,从而避免了最后再将 HashMap 中的集合拷贝到结果 res 中。当检测到当前的单词不在 HashMap 中,此时知道这个单词将属于一个新的异位词集合,所以将其映射为当前的异位词集合的个数,然后在 res 中新增一个空集合,这样就可以通过其映射值,直接找到新的异位词集合的位置,从而将新的单词存入结果 res 中,参见代码如下:
class Solution(object):def groupAnagrams(self, strs):""":type strs: List[str]:rtype: List[List[str]]"""def so(x):x= sorted(x)return ''.join(x)temp = list(map(so, strs))set_temp = list(set(temp))result = list()for i in range(len(set_temp)):result.append([]) for i in range(len(temp)):result[set_temp.index(temp[i])].append(strs[i])return result