对于这个题目来说,我们求的结果就是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')); } };