题目描述
给定一个只包含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;}