51nod1127【尺取】
思路:
尺取,写挫了,debug了半天。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+10;
char ch[N];
int vis[1001];
int main()
{
int s,t;
scanf("%s",ch);
memset(vis,0,sizeof(vis));
int len=strlen(ch);
int num=0;
int ans=len+1;
for(s=0,t=-1;s<len&&t<len;)
{
while(num<26&&t<len)//结果是s-t为满足串,t为正好满足的结尾。
{
t++;
if(ch[t]>='A'&&ch[t]<='Z')
{
if(!vis[ch[t]-'A'])
num++;
vis[ch[t]-'A']++;
}
if(num==26)
{
ans=min(ans,t-s+1);
break;
}
}
while(num==26&&s<len)//结果为s-t刚好是不满足的,注意s位置是要不满足的起始
{
if(ch[s]>='A'&&ch[s]<='Z')
{
if(vis[ch[s]-'A']==1)
num--;
vis[ch[s]-'A']--;
}
if(num==26)
{
ans=min(ans,t-s);
}
s++;
}
}
if(ans==len+1)
puts("No Solution");
else
printf("%d\n",ans);
return 0;
}