LeeCode49字母异位词分组(Java)(哈希或字符串排序)

题目链接: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;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43590593/article/details/112603833
今日推荐