leetcode 字符串的排列

 

滑动窗口的经典用法,左右指针维持窗口,当找到合适子串就返回。

 

 

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

                char l=s2.charAt(left);
                left++;
                if(valid==need.size())
                    return true;      
                if(need.containsKey(l))
                    {
                        if(window.get(l).equals(need.get(l)))
                                valid--;
                        window.replace(l,window.get(l)-1);
                    }
            }
        }
        return false;
    }

 

posted @ 2021-08-13 17:10  毅毅毅毅毅  阅读(42)  评论(0)    收藏  举报