文章目录
eli和字符串
- 题意
双指针(尺取),找一个最短子串有k个重复字母。
- 思路
这题和后面的字符串都可以用双指针的方法解决,双指针其实就是用两个变量i和j同时遍历字符串,同时用一个数组cnt[ ]记录重复字母个数,当达到k值用j回溯,以达到遍历所有情况的目的。
- 代码
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
int cnt[30];
int st[30];
int main() {
int n,k;
int res = 2e5 + 10;
bool flag = false;
string s;
cin >> n >> k;
cin >> s;
for(int i = 0;i < n;i++) {
st[s[i] - 'a']++;
}
for(int i = 0,j = 0;i < n;i++) {
cnt[s[i] - 'a']++;
while(j <= i && cnt[s[i] - 'a'] >= k) {
cnt[s[j] - 'a']--;
flag = true;
j++;
}
if(flag) {
res = min(res,i - j + 2);
flag = false;
}
}
if(res == 2e5 + 10) {
cout << -1 << endl;
}
else {
cout << res << endl;
}
return 0;
}
nozomi和字符串
- 题意
一个只由0和1组成的字符串,可以变换<=k次字符串中的字符,使得一个最长的子串中所有字符相同。
- 思路
同样还是双指针算法就可以解决。
- 代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;
int a[10];
int main() {
int n,k;
string s;
int res = 0;
cin >> n >> k;
cin >> s;
for(int i = 0,j = 0;i < n;i++) {
a[s[i] - '0']++;
while(j <= i && min(a[0],a[1]) > k) {
a[s[j] - '0']--;
j++;
}
res = max(res,i - j + 1);
}
cout << res << endl;
return 0;
}