解法一
采用Map存储变位词数组,关键在于如何对单词字符串进行编码,求得其加入Map时对应的Key值,使得变位单词具有相同的Key值且能够区分非变位单词。
两种主流的编码的方式如下
- 对单词中的字符进行排序
- 统计各个字符的出现次数,按照次数进行编码(题中限定仅出现小写字母)
- (补充)取前26个质数相乘编码
考虑到单词长度一般不会很长,第一种编码方式的表现会更佳。
import java.util.*;class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> map = new HashMap<>();for (String str : strs) {String key = getKey_1(str);if (map.containsKey(key)) {map.get(key).add(str);} else {LinkedList list = new LinkedList<>();list.add(str);map.put(key, list);}}return new ArrayList<List<String>>(map.values());}public String getKey_1(String str) {char[] chars = str.toCharArray();Arrays.sort(chars);return new String(chars);}public String getKey_2(String str) {int[] count = new int[26];char[] chars = str.toCharArray();for (char i : chars) {++count[i - 97];}StringBuilder stringBuilder = new StringBuilder(100);for (int i = 0; i < count.length; ++i) {stringBuilder.append(count[i] + "|");}return stringBuilder.toString();}}
