eli和字符串
题目描述
eli拿到了一个仅由小写字母组成的字符串。
她想截取一段连续子串,这个子串包含至少 个相同的某个字母。
她想知道,子串的长度最小值是多少?
注:所谓连续子串,指字符串删除头部和尾部的部分字符(也可以不删除)剩下的字符串。例如:对于字符串而言,、都是其子串。而、则不是它的子串。
输入描述:
第一行输入两个正整数和
输入仅有一行,为一个长度为的、仅由小写字母组成的字符串。
输出描述:
如果无论怎么取都无法满足条件,输出。
否则输出一个正整数,为满足条件的子串长度最小值。
示例1
输入
5 2
abeba
输出
3
说明
选择子串,长度为3,其中包含相同的两个'b'
#include <bits/stdc++.h> using namespace std; typedef long long ll; int n,k; string str; map<char,int> mp; int main(){ cin>>n>>k>>str; int ans=-1,l=0,cnt=0; for(int i=0;i<n;i++){ char c=str[i]; mp[c]++; while(mp[c]==k){ if(ans==-1) ans=i-l+1; else ans=min(ans,i-l+1); mp[str[l]]--; l++; } } printf("%d\n", ans); return 0; }
nozomi和字符串
题目描述
nozomi看到eli在字符串的“花园”里迷路了,决定也去研究字符串问题。
她想到了这样一个问题:
对于一个 01 串而言,每次操作可以把 0 字符改为 1 字符,或者把 1 字符改为 0 字符。所谓\mathit{“01”}“01”串,即只含字符 0 和字符 1 的字符串。
nozomi有最多 k 次操作的机会。她想在操作之后找出一个尽可能长的连续子串,这个子串上的所有字符都相同。
nozomi想问问聪明的你,这个子串的长度最大值是多少?
注: k 次操作机会可以不全部用完。
如果想知道连续子串的说明,可以去问问eli,nozomi不想再讲一遍。
输入描述:
第一行输入两个正整数和
输入仅有一行,为一个长度为 n 的、仅由字符 0 和 1 组成的字符串。
输出描述:
一个正整数,为满足条件的子串长度最大值。
示例1
输入
5 1
10101
输出
3
说明
只有 1 次操作机会。
将第二个位置的 0 改成 1 ,字符串变成 11101,可以选出 子串,长度为 3 。
如果修改第三个或者第四个位置的字符也可以选出长度为 3 的子串。
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e5 + 5; int main() { int n, k; string s; cin>>n>>k>>s; map<bool,int>cnt; int ans=-1; for(int i=0,l=0;i<n;++i){ ++cnt[s[i]-'0']; while(min(cnt[0],cnt[1])==k){ char M; if(cnt[0]>cnt[1])M='0'; else M='1'; int j=i+1; for(;s[j]==M&&j<n;++j) ; ans=max(j-l,ans); --cnt[s[l++]-'0']; } } if(ans==-1) cout<<n<<endl; else cout<<ans<<endl; return 0; }