题目链接:LeeCode49字母异位词分组
题目描述:
拿到题第一个想法就是给字符串排个序然后比较用hashmap存下来所有字符串排序后相同的字符串,然后写出了第一种解
public static List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> lists=new ArrayList<>();
Map<String,List<String>> map=new HashMap<>();
for (int i = 0; i < strs.length; i++) {
char[] chars=strs[i].toCharArray();
Arrays.sort(chars);
String s = String.valueOf(chars);
if(!map.containsKey(s)){
List<String> list=new ArrayList<>();
list.add(strs[i]);
map.put(s,list);
}else{
List<String> list = map.get(s);
list.add(strs[i]);
map.put(s,list);
}
}
for (List<String> value : map.values()) {
lists.add(value);
}
return lists;
}
然后感觉不太快去题解学了种hash的思想,自己重写一个hash函数,可以将abc和bac这样的看作同一类字符串然后通过计算使他们返回相同的hash值,难点就在于式子必须尽量散列否则鬼知道会出什么离奇相同的样例
class Solution {
public static List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> lists=new ArrayList<>();
Map<Long ,List<String>> map=new HashMap<>();
for (int i = 0; i < strs.length; i++) {
Long hash = hash(strs[i]);
if(map.containsKey(hash)){
List<String> list = map.get(hash);
list.add(strs[i]);
map.put(hash,list);
}else{
List<String> list=new ArrayList<>();
list.add(strs[i]);
map.put(hash,list);
}
}
for (List<String> value : map.values()) {
lists.add(value);
}
return lists;
}
public static Long hash(String s){
char[] chars = s.toCharArray();
long ans=0;
for (int i = 0; i < chars.length; i++) {
char c='a'-2;
long i1=chars[i]-c;;
ans+=(3*i1*i1*i1)*i1*+(5*i1*i1*i1)/33+(i1*i1)*333%10+i1*33;
}
return ans;
}
}