LeetCode滑动窗口类题目

文章介绍了如何使用滑动窗口算法解决力扣上的两道题目——无重复最长子串和替换后的最长重复字符。在无重复最长子串问题中,通过HashSet确保窗口内无重复字符;在最长重复字符问题中,动态调整窗口大小,确保最多替换k个字符后仍满足条件。
摘要由CSDN通过智能技术生成

力扣

无重复最长子串

滑动窗口

1.窗口的滑动

2.窗口的内容

本体要求窗口内无重复,用set来保障么没有重复,不要忘记right位置一定要添加到set中

因为便利的是right,遍历right复杂度是n

class Solution {
    public int lengthOfLongestSubstring(String s) {
        //左右指针记录窗口起始结束位置,遍历结束位置
        //记录最大窗口大小
        //用Set记录是否遍历过

        int result = 0;
        int left = 0;
        int right = 0;
        Set<Character> set = new HashSet<>();

        for(;right < s.length();right++){
            char c = s.charAt(right);
            if(set.contains(c)){
                while(set.contains(c)){
                    set.remove(s.charAt(left++));
                }
            }
            set.add(c);

            result = Math.max(result,right - left + 1);
        }
        return result;
    }
}

424. 替换后的最长重复字符

class Solution {
    public int characterReplacement(String s, int k) {
        //暴力求解,遍历每个字符串 n^2 
        //对每个字符串进行判断,如果改k个可以记录记录长度,最后取最长。
        //滑动窗口,鉴于取最大值,只需要最大窗口长度不受污染就可以,只需要在窗口需要变大时更新
        //遍历端口的右端点,最长出现字符的次数,窗口大小-最大出现次数 > k 则left向前移动一位(因为right是遍历一直加一)保证窗口大小不会变化
        //只有当窗口大小-最大出现次数 <= k的时候可以尝试加大窗口。
        
        //记录字母出现次数
        int[] alphabet = new int[26];
        
        int right = 0;
        int left = 0;
        int max = 0;
        int result = 0;

        for(;right < s.length();right++){
            int index = s.charAt(right) - 'A';//右端字母索引
            alphabet[index]++;//对应字母出现次数增加
            int size = right - left + 1;//窗口大小
            max = Math.max(max,alphabet[index]);
            if(size - max > k){
                alphabet[s.charAt(left) - 'A']--;//删除最左侧的字母,此时删除可能会导致当前窗口内的字母不符合要求,但是窗口大小不会变大变小,不影响最终结果
                left++;
            }

            result = Math.max(result,right - left +1 );
        }
        return result;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值