题解
这题就是哈希,让同样char的组合有同样的键值,注意防碰撞。
用了素数表,字符数位的素数做乘积作为键。
ps: 平时不写java,临时写一下遇到无数bug。常见的与c++ api 不同的就算了。
比如 Arrays.asList(str),只可读不可写。。。
List<List> 与 ArrayList< ArrayList > 不匹配。。。
Code
class Solution {
public int[] col= {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157};
public List<List<String>> groupAnagrams(String[] strs) {
int p;
int n=0;
int pos;
Map<Integer,Integer> map = new HashMap<>();
List<List<String>> res = new ArrayList< List <String> >();// keng
for(String str:strs){
p = 1;
for(int i=str.length()-1;i>-1;i--){
p*= col[str.charAt(i) - 'a'];
}
pos=map.getOrDefault(p,n);
if(pos == n){
res.add( new ArrayList<>( Arrays.asList(str)) );// keng
map.put(p,n);
n++;
}else{
res.get(pos).add(str);
}
}
return res;
}
}