51nod1127【尺取】

来源:互联网 发布:linux版安卓模拟器 编辑:程序博客网 时间:2024/05/04 03:04

思路:
尺取,写挫了,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;}
0 0
原创粉丝点击