Group Anagrams (M)
Given an array of strings, group anagrams together.
Example:
Input: ["eat", "tea", "tan", "ate", "nat", "bat"],
Output:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
Note:
- All inputs will be in lowercase.
- The order of your output does not matter.
题意
给定一个字符串数组,将由相同字符集合组成的字符串进行分组。
思路
如果两个字符串由相同字符集合组成,说明两个字符串含有的字母种类相同,且每种字母的个数相同。可以用一个26位长度的串来作为指定字符串的hashCode,每一位上的数字字符代表对应字母在字符串中出现的个数,问题就转化为了根据hashCode来对字符串进行分组。
同样也可以将字符串各字符按照字典序重新排序后得到的字符串作为hashCode。
代码实现
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> ans = new ArrayList<>();
Map<String, List<String>> map = new HashMap<>();
for (int i = 0; i < strs.length; i++) {
String hashCode = hash(strs[i]);
if (map.containsKey(hashCode)) {
map.get(hashCode).add(strs[i]);
} else {
List<String> list = new ArrayList<>();
list.add(strs[i]);
map.put(hashCode, list);
}
}
for (String s : map.keySet()) {
ans.add(map.get(s));
}
return ans;
}
// 第一种hash,以个数统计字符串作为hashCode
private String hash(String s) {
int[] alphabet = new int[26];
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
alphabet[c - 'a']++;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 26; i++) {
sb.append((char) (alphabet[i] + '0'));
}
return sb.toString();
}
// 第二种hash,以字典序正序字符串作为hashCode
private String hash(String s) {
char[] chars = s.toCharArray();
Arrays.sort(chars);
return String.valueOf(chars);
}
}