当前位置: 代码迷 >> 综合 >> Leetcode 滑动窗口:AC替换最长连续相同串
  详细解决方案

Leetcode 滑动窗口:AC替换最长连续相同串

热度:95   发布时间:2024-02-27 16:29:00.0

题目描述

给定一个只包含A和C的字符串,你可以任意修改最多k个字符,让A变成C,或者C变成A。请问修改完之后,最长连续相同字符的长度是多少。

输入

1,"AAAC"

输出

4

 

类似于连续的问题,采取滑动窗口,维护一个l=>r的窗口,确保窗口内的在最多K次调整下,可以组合成相同的字符串。

基本策略:

当窗口内A的字符、C的字符都大于K时,那么一定无法替换成相同的字符串,此时l++
否则,窗口内可以替换成相同的字符串,ans=max(ans,r-l+1)  同时r++

采取num[2]记录A C字符的数量,每次移动的时候,减少或增加。

易错点:

  • 初始化l=r=0此时需要统计s[0]到num[]中
  • l=>r 表示s[l]到s[r]包含r-l+1个字符
int Solve(int k, string s) {// write code hereint len=s.size();//总长度if(len==0)return 0;int l=0;int r=0;//滑动窗口区间int num[2]={0};//num[0]表示A的数量  num[1]表示C的数量int ans=1;if(s[l]=='A')num[0]++;elsenum[1]++;while(r<len){if(num[0]>k && num[1]>k)  //如果滑动窗口内 A的数量 C的数量 均大于K 那么不可能组成相同字符{if(s[l]=='A')num[0]--;elsenum[1]--;l++;  //左边断点右移动  }else  //说明窗口能够组合成连续相同{ans=max(ans,(r-l+1));r++;if(s[r]=='A')num[0]++;elsenum[1]++;    }}  return ans;}