PS:exemple2
解题思路
由于输入都是小写字母,最多奇迹长度也就26,考虑二分长度,然后check就相当于移动区间,把长度为mid的区间不断向后移就完了。
代码
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
#define db double
using namespace std;
int n,ans,v[30];
string s;
bool check(int x) {
memset(v,0,sizeof(v));
int st=0,cnt=0;
for(int i=0; i<n; i++) {
if(!v[s[i]-'a'])
cnt++;
v[s[i]-'a']++;
if(i-st+1==x) {
if(cnt==x)
return 1;
else {
if(v[s[st]-'a']==1)
cnt--;
v[s[st]-'a']--;
st++;
}
}
}
return 0;
}
int main() {
scanf("%d",&n);
cin>>s;
int l=1,r=26;
while(l<=r) {
int mid=(l+r)/2;
if(check(mid)) {
ans=mid;
l=mid+1;
} else r=mid-1;
}
printf("%d",ans);
}