基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
收藏
关注
给出一个字符串,求该字符串的一个子串s,s包含A-Z中的全部字母,并且s是所有符合条件的子串中最短的,输出s的长度。如果给出的字符串中并不包括A-Z中的全部字母,则输出No Solution。
Input
第1行,1个字符串。字符串的长度 <= 100000。
Output
输出包含A-Z的最短子串s的长度。如果没有符合条件的子串,则输出No Solution。
Input示例
BVCABCDEFFGHIJKLMMNOPQRSTUVWXZYZZ
Output示例
28
之前好像遇到过这样的问题,不过还是不太明白,搜了尺取法,基本上是从头开始找,直到找到符合条件的然后停止,从前面的位置往后走,如果还满足的话一直往后走,知道不满足,然后后面的接着走。
是在网上找到的。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string.h>
#define inf 0x3f3f3f3f
using namespace std;
int flag[27];
int main()
{
string a;
cin>>a;
memset(flag,0,sizeof(flag));
int r=0,l=0,sum=0;
int ans=inf;
for( ;r<a.length();r++)
{
if(flag[a[r]-'A']==0)//如果没有标记过
sum++;
flag[a[r]-'A']++;
while( flag[a[l]-'A'] > 1)//在满足条件的情况下查看是否可以向前蠕动
{
flag[a[l]-'A']--;
l++;
}
if (sum == 26)
{
ans=min(ans,r-l+1);//搜索最小条件
}
}
if(ans==inf) cout<<"No Solution"<<endl;
else cout<<ans<<endl;
return 0;
}