最短的包含字符串 (尺取法)
给出一个字符串,求该字符串的一个子串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 <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
char a[100100];
int flag[26];
int yang()
{
int i;
for(i=0;i<26;i++)
{
if(flag[i]==0)
break;
}
if(i>=26)
return 1;
else
return 0;
}
int main()
{
int l=0,r=0,sum=0,n=0,p=0,i;
memset(a,0,sizeof(a));
gets(a);
n=strlen(a);
sum=n+1;
if(n<26)
printf("No Solution\n");
else
{
for(i=0;i<26;i++)
flag[a[i]-65]++;
p=yang();
if(p==1&&n==26)
{
printf("26\n");
return 0;
}
r=26;
for(i=26;i<n;i++)
{
p=yang();
if(p==0)
flag[a[r++]-65]++;
while(yang())
{
sum=min(r-l,sum);
flag[a[l++]-65]--;
}
}
if(sum>n)
printf("No Solution\n");
else
printf("%d\n",sum);
}
return 0;
}
改成下面的也对(简化版)
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
char a[100100];
int flag[26];
int yang()
{
int i;
for(i=0; i<26; i++)
{
if(flag[i]==0)
break;
}
if(i>=26)
return 1;
else
return 0;
}
int main()
{
int l=0,r=0,sum=0,n=0,p=0,i;
memset(a,0,sizeof(a));
gets(a);
n=strlen(a);
sum=n+1;
for(i=0; i<n; i++)
{
flag[a[r++]-65]++;
while(yang())
{
sum=min(r-l,sum);
flag[a[l++]-65]--;
}
}
if(sum>n)
printf("No Solution\n");
else
printf("%d\n",sum);
return 0;
}