C语言/数据结构滑动窗口题解:替换k个字符后的最长连续相同字符子串(LeetCode 424)

问题描述

小红在玩一个字符串游戏,她有一个由大写字母组成的字符串 s 和一个整数 k。游戏规则允许她进行最多 k 次字符替换操作(每次操作可以将任意一个字符替换成另一个大写字母),她希望通过这些操作使得字符串中出现一个尽可能长的由相同字符组成的连续子串。

例如,如果字符串是 "AABBBCC"k = 2,小红可以将两个 'C' 替换成 'B',从而得到全为 'B' 的子串 "BBBBBB",长度为 7。

请你帮助小红设计一个算法,计算在最多进行 k 次替换后,字符串中最长的连续相同字符子串的长度。

测试样例

样例1:

输入:s = "ABAB", k = 2 输出:4 解释:将两个 'A' 替换为 'B',或者将两个 'B' 替换为 'A',可以得到全为 'A' 或全为 'B' 的字符串,最长子串长度为 4。

样例2:

输入:s = "AABABBA", k = 1 输出:4 解释:将中间的一个 'A' 替换为 'B',可以得到 "AABBBBA",其中 "BBBB" 是长度为 4 的连续相同字符子串。

样例3:

输入:s = "ABCDE", k = 2 输出:3 解释:例如,将 'C''D' 替换为 'B',可以得到 "ABBBE",其中 "BBB" 是长度为 3 的连续子串。

约束条件

  • 1 ≤ s.length ≤ 10^5
  • s 仅由大写英文字母组成
  • 0 ≤ k ≤ s.length
  • 要求算法时间复杂度为 O(n) 或 O(n log n)

程序代码

#include <stdio.h>

#include <string.h>

int characterReplacement(char* s, int k) {

int count26 = {0}; // 记录窗口内每个字符的出现次数

int left = 0;

int maxCount = 0; // 窗口内出现次数最多的字符的次数

int maxLen = 0;

int len = strlen(s);

for (int right = 0; right < len; right++) {

int idx = sright - 'A';

countidx++;

if (countidx > maxCount) {

maxCount = countidx;

}

// 当前窗口长度 = right - left + 1

// 需要替换的字符数 = 窗口长度 - maxCount

// 如果超过 k,说明这个窗口无法通过 k 次替换变成全相同字符

while ((right - left + 1) - maxCount > k) {

counts\[left - 'A']--;

left++;

}

// 更新最大长度

int curLen = right - left + 1;

if (curLen > maxLen) {

maxLen = curLen;

}

}

return maxLen;

}

int main() {

printf("%d\n", characterReplacement("ABAB", 2)); // 应输出 4

printf("%d\n", characterReplacement("AABABBA", 1)); // 应输出 4

printf("%d\n", characterReplacement("ABCDE", 2)); // 应输出 3

return 0;

}

cpp 复制代码
#include <stdio.h>
#include <string.h>

int characterReplacement(char* s, int k) {
    int count[26] = {0};  // 记录窗口内每个字符的出现次数
    int left = 0;
    int maxCount = 0;     // 窗口内出现次数最多的字符的次数
    int maxLen = 0;
    int len = strlen(s);

    for (int right = 0; right < len; right++) {
        int idx = s[right] - 'A';
        count[idx]++;
        if (count[idx] > maxCount) {
            maxCount = count[idx];
        }

        // 当前窗口长度 = right - left + 1
        // 需要替换的字符数 = 窗口长度 - maxCount
        // 如果超过 k,说明这个窗口无法通过 k 次替换变成全相同字符
        while ((right - left + 1) - maxCount > k) {
            count[s[left] - 'A']--;
            left++;
        }

        // 更新最大长度
        int curLen = right - left + 1;
        if (curLen > maxLen) {
            maxLen = curLen;
        }
    }

    return maxLen;
}

int main() {
    printf("%d\n", characterReplacement("ABAB", 2));      // 应输出 4
    printf("%d\n", characterReplacement("AABABBA", 1));   // 应输出 4
    printf("%d\n", characterReplacement("ABCDE", 2));     // 应输出 3
    return 0;
}

运行结果

相关推荐
free-elcmacom2 小时前
发际线警告!手撕《C陷阱与缺陷》终极 BOSS:signal 函数与 typedef 魔法
c语言·开发语言·visual studio code·visual studio
程序员阿鹏2 小时前
简单介绍一下软引用
java·开发语言·jvm·数据结构·后端
haluhalu.2 小时前
初识 Protobuf:微服务跨语言通信的一份契约
java·c语言·开发语言·c++·python
临期冰淇淋3 小时前
Unisoc 展锐平台Camera摄像头分辨率适配
linux·c语言·驱动开发
爱奥尼欧3 小时前
【C++】map、set 的底层是什么?红黑树五条性质、插入旋转到模拟实现
开发语言·数据结构·c++
山下梅子酒2254 小时前
洛谷-入门-B2054
c语言
动词ing4 小时前
【题目练习】动态规划+背包问题
数据结构·目标检测
杜 硕4 小时前
单链表经典算法题
数据结构·算法