2019.5.23 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新)
这题还是有点技巧。根本上来说,只需要通过一个哈希表就可以进行分组。技巧在于如何选取哈希表的Key值。有三种方案:
1.将排序后的字符数组作为Key
2.统计字母出现次数作为key
3.用质数表示每一个字母,用字符串字母乘积作为key
另外在使用过程中需要注意String作为哈希表key值的问题(相同值的String变量哈希码可能不同)
对于charArray变量,String.valueOf()底层是new String()。
相同值不同哈希码的charArray变量依次使用Object.toString()之后hashCode()不同,依次使用String.valueOf()之后hashCode()相同。
对于StringBuildrer变量,String.valueOf()底层是Object.toString(),StringBuildrer重写的toString()底层是new String()。
相同值不同哈希码的StringBuildrer变量依次使用String.valueOf()/Object.toString()之后hashCode()相同,依次使用toString()之后hashCode()也相同。
Given an array of strings, group anagrams together.
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
import java.util.*;
/**
*
* Given an array of strings, group anagrams together.
* 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
*
*/
public class GroupAnagrams {
//将排序后的字符数组作为key
//相同值不同哈希码的charArray变量依次使用Object.toString()之后hashCode()不同,依次使用String.valueOf()之后hashCode()相同。
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<String, ArrayList<String>> map = new HashMap<>();
for(String str : strs){
char[] cs = str.toCharArray();
Arrays.sort(cs);
// 不能用String key = cs.toString();,直接在常量池中新建对象。
// String key = String.valueOf(cs);先检查常量池中的对象,没有才新建。
String key = String.valueOf(cs);
if(!map.containsKey(key)){
map.put(key, new ArrayList<>());
}
map.get(key).add(str);
}
return new ArrayList(map.values());
}
//统计字母出现次数作为key(改进:用质数表示每一个字母,用乘积作为字符串的key)
//相同值不同哈希码的StringBuildrer变量依次使用String.valueOf()/Object.toString()之后hashCode()相同,依次使用toString()之后hashCode()也相同。
public List<List<String>> groupAnagrams2(String[] strs){
if(strs.length <= 0){
return new ArrayList<>();
}
HashMap<String, ArrayList<String>> map = new HashMap<>();
for(String str : strs){
char[] cs = str.toCharArray();
int[] count = new int[26];
for(char c : cs){
++count[c - 'a'];
}
StringBuilder s = new StringBuilder("");
for(int num : count){
s.append(num);
}
//使用String.valueOf()或者toString()均可。
String key = String.valueOf(s);
//String key = s.toString();
if(!map.containsKey(key)){
map.put(key, new ArrayList<>());
}
map.get(key).add(str);
}
return new ArrayList(map.values());
}
}
#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#