双指针

LeetCode 424 Longest Repeating Character Replacement

思路

暴力解法

  • 遍历字符串的所有子串,对每个子串检查是否满足条件:找到该子串出现次数最多的字符,剩下字符的数量小于k,如果满足记录子串长度。O^3
  • 找到满足条件子串中最长的。

双指针

原因

  1. 子串[i, j]的左i不变,满足条件的j最大的时候 => 不需要去遍历更大的j了(剪枝?),此时可以去变化i了、
  2. 那如果对每个i,都找到一个满足条件的最大j,记录此时的[i, j]
  3. 复杂度O^2
  4. 更高效的:当找到一个i定点,j最大的时候,将i,j各加一(滑动窗口),即向右移动一格,之后如果j能更大则j++(滑动窗口变大),直至滑到最后。O(n)

代码

int f(string s, int k) {
    vector<int> num(26, 0);
    int left = 0;
    int right = 0;
    int maxCharacterNum = 0;
    while (right < s.length()) {
        num[s[right] - 'A']++;
        maxCharacterNum = max(maxCharacterNum, num[s[right] - 'A']);
        if (right - left + 1 - maxCharacterNum > k) {
            num[s[left++] - 'A']--;
        }
        right++;
    }
    return right - left;
}

posted on 2021-02-02 22:30  路过的小游侠_Eyes  阅读(15)  评论(0)    收藏  举报

导航