滑动窗口总结

滑动窗口总结

解决数组/字符串的子元素问题

3. 无重复字符的最长子串

class Solution {
    public int lengthOfLongestSubstring(String s) {
        // 滑动窗口
        Set<Character> occ = new HashSet<>();
        int n = s.length();
        int rk = -1, ans = 0;
            for (int i = 0; i < n; i++) {
                if(i != 0) {
                    occ.remove(s.charAt(i-1));
                }
                while (rk+1 < n && !occ.contains(s.charAt(rk+1))) {
                    occ.add(s.charAt(rk+1));
                    rk++;
                }
                ans = Math.max(ans, rk+1 - i);
            }
            return ans;
    }
}

567. 字符串的排列

class Solution {
    public boolean checkInclusion(String s1, String s2) {
        // 滑动窗口
        int n1 = s1.length(), n2 = s2.length();
        if ( n1 > n2 ) return false;
        int[] cnt1 = new int[26];   // 统计 s1 字符个数
        int[] cnt2 = new int[26];   // 统计 滑动窗口 字符个数
        for (int i = 0; i < n1; i++) {
            cnt1[s1.charAt(i)-'a']++;
            cnt2[s2.charAt(i)-'a']++;
        }
        if( Arrays.equals(cnt1, cnt2)) return true;
        for (int i = n1; i < n2; i++) {
            cnt2[s2.charAt(i)-'a']++;
            cnt2[s2.charAt(i-n1)-'a']--;
            if( Arrays.equals(cnt1, cnt2)) return true;
        }
        return false;
    }
}
posted @ 2021-11-02 23:29  爆辣牛筋丸  阅读(61)  评论(0)    收藏  举报