最短的包含字符串 (尺取)

Description

给出一个字符串,求该字符串的一个子串s,s包含A-Z中的全部字母,并且s是所有符合条件的子串中最短的,输出s的长度。如果给出的字符串中并不包括A-Z中的全部字母,则输出No Solution。

Input

第1行,1个字符串。字符串的长度 <= 100000。

Output

输出包含A-Z的最短子串s的长度。如果没有符合条件的子串,则输出No Solution。

Sample Input

BVCABCDEFFGHIJKLMMNOPQRSTUVWXZYZZ

Sample Output

28

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <stack>
#include <algorithm>
#include <stack>
#include <vector>
#define MAX 0x3f3f3f3f
using namespace std;
char s[111111];
int main()
{
    int l=0,t=0,a[1000],sum=0,ans=MAX,flag=0;
    memset(a,0,sizeof(a));
    cin >> s;
    for(int i=0;s[i];i++)
    {
        if(a[s[i]]==0)
            t++;                                         // t记录已经有了几种字母
        a[s[i]]++;                                    //a[  ]记录每种字母有多少个
        while(t==26)
        {
            flag=1;
            ans=min(ans,i-l+1);
            a[s[l]]--;
            if(a[s[l]]==0)                         //当a[ ]为0时,便少了一种字母,所以 t 要减去 1
                t--;
            l++;
        }
    }
    if(!flag)
        cout << "No Solution" <<endl;
    else
        cout << ans <<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m_y_y_/article/details/81087659