leetcode——567. 字符串的排列

Map<Character,Integer> ori = new HashMap<>();
    public boolean checkInclusion(String s1, String s2) {
        char[] c = s1.toCharArray();
        for(char c1:c){
            ori.put(c1,ori.getOrDefault(c1,0)+1);
        }
        int i = 0;
        int len1 = s1.length();
        int len2 = s2.length();
        while(i<=len2-len1){
            if(ori.containsKey(s2.charAt(i))){
                int j = i;
                Map<Character,Integer> cnt = new HashMap<>();
                boolean flag = false;
                for(;j<i+len1;j++){
                    if(!ori.containsKey(s2.charAt(j))){
                        flag = true;
                        i = j-1;
                        break;
                    }
                    cnt.put(s2.charAt(j),cnt.getOrDefault(s2.charAt(j),0)+1);
                }
                if(!flag) {
                    if(check(cnt)){
                        return true;
                    }
                }
            }
            i++;
        }
        return false;
    }

    private boolean check(Map<Character,Integer> cnt) {
        for (char c : ori.keySet()) {
            if (!cnt.getOrDefault(c, 0).equals(ori.get(c))) {
                return false;
            }
        }
        return true;
    }

 对是对了,但是好慢。

public boolean checkInclusion(String s1, String s2) {
        Map<Character,Integer> need = new HashMap<>();
        Map<Character,Integer> window = new HashMap<>();
        char[] c = s1.toCharArray();
        for(char c1:c){
            need.put(c1,need.getOrDefault(c1,0)+1);
        }
        int left = 0,right = 0;
        int valid = 0;
        while(right<s2.length()){
            char c1 = s2.charAt(right);
            right++;
            if(need.containsKey(c1)){
                window.put(c1,window.getOrDefault(c1,0)+1);
                if(window.get(c1).equals(need.get(c1))){
                    valid++;
                }
            }
            while (right-left>=s1.length()){
                if(valid == need.size()){
                    return true;
                }
                char d = s2.charAt(left);
                left++;
                if(need.containsKey(d)){
                    if(window.get(d).equals(need.get(d))){
                        valid--;
                    }
                    window.put(d,window.get(d)-1);
                }
            }
        }
        return false;
    }

我的前方是万里征途,星辰大海!!
原文地址:https://www.cnblogs.com/taoyuxin/p/13594677.html