Skip to content

Latest commit

 

History

History
55 lines (43 loc) · 1.55 KB

maxrepopt1.md

File metadata and controls

55 lines (43 loc) · 1.55 KB

题目描述:

image

解决过程:

没做出来

  • 滑动窗口

代码:(滑动窗口)

class Solution {
public:
    int maxRepOpt1(string text) {
        unordered_map<char, int> map;
        for (auto c : text) {
            // 计算text中每个字符出现的次数
            map[c]++;
        }

        int res = 0, n = text.size();
        for (int i = 0; i < n; ) {
            int j = i;
            // 寻找一段连续的字符相同的子串
            while (j < n && text[j] == text[i]) {
                j++;
            }

            // 如果这段连续的字符相同的子串前后有可以交换的空间,
            // 并且总个数小于字符text[i]的总数,则更新答案
            if (j - i < map[text[i]] && (i > 0 || j < n)) {
                res = max(res, j - i);
            }

            int k = j + 1;
            // 考虑j之后可能有连续的text[i]字符,并且每次替换总是优先
            // 替换位置j的字符(如果不能替换说明到头了,k也无需考虑),
            // 则这两段子串拼接起来可以得到更长的答案。

            // 同时需要考虑aaaaabaaaaa这种情况,此时k - i大于map[a],因此
            // 在更新答案时应取k - imap[a]的最小值
            while (k < n && text[k] == text[i]) {
                k++;
            }
            res = max(res, min(k - i, map[text[i]]));

            i = j;
        }

        return res;
    }
};