参考GPT和自己的思路:这道题可以使用双指针的思路来解决,具体做法如下:
从左到右遍历字符串,维护一个区间 [l, r],表示以 s[r] 为结尾的长度最大为 m 的子串。
如果 s[r] 与 s[l] 不同,则需要将该区间中的所有字符替换成 s[r],并将区间向右移动一位,即令 l = r,r = r + 1。
如果 s[r] 与 s[l] 相同,则令 r = r + 1。
在遍历过程中,记录替换的次数,最后输出即可。
下面是 C++ 的代码实现:
#include <iostream>
#include <cstring>
using namespace std;
const int N = 2e5 + 10;
int n, m;
char s[N];
int main()
{
cin >> n >> m;
cin >> s;
int l = 0, r = 0;
int res = n;
while (r < n)
{
if (r - l + 1 <= m) res = min(res, max(1, r - l + 1) - (r - l + 1));
else
{
if (s[r] != s[l])
{
res = min(res, max(1, r - l) - (r - l));
l++;
}
else r++;
}
}
cout << res << endl;
return 0;
}
代码中,用 res 记录替换的次数,初始值为字符串长度 n,即最坏情况下每个字符都需要替换一次。
在遍历字符串的过程中,如果当前区间长度不超过 m,则直接将替换次数减去区间长度,即将该区间中的所有字符替换成 s[r]。
如果当前区间长度超过 m,则需要将左端点 l 向右移动一位,即将区间缩小,并将替换次数减去区间长度减一,因为除了 s[r] 以外的字符都需要替换成 s[r]。
遍历结束后,输出最终的替换次数即可。