字母异位词分组
题目
版本1 正确
public List<List<String>> groupAnagrams(String[] strs) {
// 将strs中字母异位词组合在一起, 放到一个List中
// 字母异位词即字母种类和数量相同, 但是位置不同, 例如abc和cba
// 因此题目的核心就是如何为异位词计算出一个相同的标志, 这样就能统计相同异位词的列表
Map<String, List<String>> key2ListMap = new HashMap<>();
// 判断两个字符串是否是异位词, 没有什么讨巧的办法, 就是将字符串中的字符排序后, 比较大小
// 所有异位词排序后的结果是一样的, 因此可以作为同一组异位词的key
for(int i = 0; i < strs.length; i ++) {
char [] temp = strs[i].toCharArray();
Arrays.sort(temp);
String key = new String(temp);
List<String> preList = key2ListMap.getOrDefault(key, new ArrayList<>());
preList.add(strs[i]);
key2ListMap.put(key, preList);
}
return new ArrayList<>(key2ListMap.values());
}
正确的原因
(1) 如何为每个异位词找到相同的标志
(2) 字符串缓存池的问题, 才保证了String key = new String(temp); 都是同一个对象