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