第1行,1个字符串。字符串的长度 <= 100000。
输出包含A-Z的最短子串长度。如果没有符合条件的子串,则输出No Solution。
BVCABCDEFFGHIJKLMMNOPQRSTUVWXZYZZ
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;
}