滑动窗口问题

基本原理

双指针,在左右两个边界处分别设有指针,一般可用于数组和字符串的应用,且优点遍历次数较少。
在这里插入图片描述
用双指针来限定窗口的范围,每一次对与指针进行滑动,来对于窗口里的数据结合判断。

例题

给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。(力扣424题)
分析:对于此问题,可以用双指针限定窗口,再寻找窗口里的最多字符,
来遍历窗口寻找非该字符的其他字符出现的次数,与K值进行比较。
首先,尾指针右移,窗口长度加一,如果满足条件,则继续执行,否则头指针右移,窗口长度减一,对比即窗口整体右移。

int max(int *a,int left,int right) //函数找该窗口非最多字符出现次数
{  int t=0,x=0;
    for(int i=0;i<26;i++)
    {
        if(a[i]>t)
        t=a[i];
    }
    return right-left-t;
}
  int characterReplacement(char* s, int k) 
  {
   if(*s==0)
   return 0;
    int a[26]={0};
    int n = strlen(s);
    int t=0;
    int left = 0, right = 0;
    a[s[0]-'A']++;
    while (right < n) 
    {
         right++;                    //窗口扩大,右指针右移
         a[s[right] - 'A']++;          
        if (max(a,left,right) > k) 
        {
            a[s[left] - 'A']--;      //窗口缩小,左指针左移
            left++;
        }
        if(t<(right-left))      
         t=right-left;
    }
    return t;
}

//图一引用于https://www.cnblogs.com/huansky/p/13488234.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值