给定一个字符串数组 strs
,将 变位词 组合在一起。 可以按任意顺序返回结果列表。
注意:若两个字符串中每个字符出现的次数都相同且字符顺序不完全相同,则称它们互为变位词。
示例 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]
仅包含小写字母
注意:本题与主站 49 题相同: https://leetcode-cn.com/problems/group-anagrams/
遍历字符串,将每个字符串按照字符字典序排序后得到一个新的字符串,将相同的新字符串放在哈希表的同一个 key 对应 value 列表中。
key | value |
---|---|
"aet" |
["eat", "tea", "ate"] |
"ant" |
["tan", "nat"] |
"abt" |
["bat"] |
最后返回哈希表的 value 列表即可。
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
chars = collections.defaultdict(list)
for s in strs:
k = ''.join(sorted(list(s)))
chars[k].append(s)
return list(chars.values())
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> chars = new HashMap<>();
for (String s : strs) {
char[] t = s.toCharArray();
Arrays.sort(t);
String k = new String(t);
if (!chars.containsKey(k)) {
chars.put(k, new ArrayList<>());
}
chars.get(k).add(s);
}
return new ArrayList<>(chars.values());
}
}
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string> &strs) {
unordered_map<string, vector<string>> chars;
for (auto s : strs)
{
string k = s;
sort(k.begin(), k.end());
chars[k].emplace_back(s);
}
vector<vector<string>> res;
for (auto it = chars.begin(); it != chars.end(); ++it)
{
res.emplace_back(it->second);
}
return res;
}
};
func groupAnagrams(strs []string) [][]string {
chars := map[string][]string{}
for _, s := range strs {
key := []byte(s)
sort.Slice(key, func(i, j int) bool {
return key[i] < key[j]
})
chars[string(key)] = append(chars[string(key)], s)
}
var res [][]string
for _, v := range chars {
res = append(res, v)
}
return res
}