题目
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
示例 1:
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]
解释:
在 strs 中没有字符串可以通过重新排列来形成 “bat”。
字符串 “nat” 和 “tan” 是字母异位词,因为它们可以重新排列以形成彼此。
字符串 “ate” ,“eat” 和 “tea” 是字母异位词,因为它们可以重新排列以形成彼此。
链接:[https://leetcode.cn/problems/group-anagrams/description/?envType=study-plan-v2&envId=top-100-liked)
思路
如果两个字符串,每个字母出现的次数是一样的,那么这两个字符串就是字母异位词。每个字符串中只有小写字母,那么可以有一个26位长度的数组arr
表示,其中arr[i]
的值代表字符串中,字符a+i
出现的次数(eg:如果字符串中e出现了10次,那么arr[e-a]
即arr[4]=10
)。将每个字符串对应的数组转成String(不能直接数字转,需要位置对应的字母+数字),因此可以设置一个Map<String, List<String>>
,其中key为字符串对应的数组转成String,value则是字符串列表。综上,是字母异位词的字符串对应的key相同的,因此把Map的Value转成List即可。
备注
字符串对应的数组转成String(不能直接数字转,需要位置对应的字母+数字)是因为比如[“bdddddddddd”,“bbbbbbbbbbc”],第一个是1个b、10个d,第二个10个b,1个c。对应的数组分别为[0,1,0,10,0……],[0,10,1,0,0,……],直接转均为010100……。因此加上对应的字符,变为b1d10和b10c1
题解
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> map = new HashMap<>();
for (int i = 0; i < strs.length; i++) {
int[] counts = new int[26];
for (char c : strs[i].toCharArray()) {
counts[c - 'a']++;
}
StringBuffer sb = new StringBuffer();
for (int j = 0; j < 26; j++) {
if (counts[j] != 0) {
sb.append((char) ('a' + j));
sb.append(counts[j]);
}
}
List<String> index = map.getOrDefault(sb.toString(), new ArrayList<>());
index.add(strs[i]);
map.put(sb.toString(), index);
}
return new ArrayList<List<String>>(map.values());
}
}