51nod 1127 最短的包含字符串 尺取法

来源:互联网 发布:博士申请 知乎 编辑:程序博客网 时间:2024/05/17 03:48
给出一个字符串,求该字符串的一个子串S,S包含A-Z中的全部字母,并且S是所有符合条件的子串中最短的,输出S的长度。如果给出的字符串中并不包括A-Z中的全部字母,则输出No Solution。
Input
第1行,1个字符串。字符串的长度 <= 100000。
Output
输出包含A-Z的最短子串长度。如果没有符合条件的子串,则输出No Solution。
Input示例
BVCABCDEFFGHIJKLMMNOPQRSTUVWXZYZZ
Output示例

28




要求用最小的长度来达到某一个条件,这种题目用尺取法来解决

#include <iostream>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
char str[110000];
int vis[30];


bool check()
{
    for(int i=0;i<26;i++)
    {
        if(vis[i]==0)
            return false;
    }
    return true;
}
int main()
{
    cin>>str;
    int len=strlen(str);
    int t=0;  //右边
    int s=0;  //左边
    int res=len+1; //输出值
    memset(vis,0,sizeof(vis));
    for(;;) //无限循环
    {
        while(t<len&&!check()) //从s开始到t位置,满足全部条件
        {
            int c=str[t]-'A';
vis[c]++;
            t++;
        }
        if(t==len)  
            break;
        res=min(res,t-s); //记录长度
        int cc=str[s]-'A'; //相关判断条件的改变
        if(vis[cc]==1)
        {
            vis[cc]=0;
           
        }
        else
        {
            vis[cc]--;
        }
s++;     //开始位置+1
    } 
    if(res==len+1)
        cout<<"No Solution"<<endl;
    else 
    cout<<res<<endl;
}