对于这个题目来说,我们求的结果就是A串最长或者是C串最长,然后取最大值即可,在找串最长的过程采用two points的方法。我们以求A串最长为例,那么需要做的改变就是将C变为A,在改变的时候采用贪心的方法(由于是对于一个子串的更改,如果要使子串长度最长,那么更改的顺序一定是连续的),然后统计当前区间中有多少个字符C,如果区间中C的个数不大于K,则r++,如果大于k,则l++,直至区间中C的数量不大于k,需要注意的是在每次移动r的时候维护区间长度最大值。
时间复杂度: O(n)
额外空间复杂度: O(1)
class Solution {
public:
/**
*
* @param k int整型
* @param s string字符串
* @return int整型
*/
int cal(int k, string s, char c) {
int len = s.size(), l = 0, r = 0, tmp = k, ans = 0;
while(l<len && r<len) {
while(tmp>=0 && r<len) {
if(s[r]!=c && tmp==0) break;
if(s[r] != c) tmp--;
ans = max(r-l+1, ans);
r++;
}
if(s[l] != c) tmp++;
l++;
}
return ans;
}
int Solve(int k, string s) {
// write code here
return max(cal(k, s, 'A'), cal(k, s, 'C'));
}
};
京公网安备 11010502036488号