1774: 最短的串
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 26 Solved: 10
[ Submit][ Status][ Web Board]
Description
给出一个字符串S,需要找到最短的子串s,使得子串s包含S中出现的所有字母至少一次,输出这个长度(length(S)<=1000000)
Input
一个字符串S
Output
一个数代表最短的长度
Sample Input
bcAAcbc
aaBCCe
Sample Output
3
5
【解析】
此题呢虽然自己没想出来,但是感觉还是要说一下大佬的应用,其实这道题是这样子的我们可以先统计一下不算重复
字母,不同字母的个数,然后我们下面就从这个入手,在我们下面第一次达到这个数字的时候,我们就判断第一个字
符后面有没有出现过,如果出现过了,我们就把前面那一位给减去了,然后再判断第二个,如果后面出现过了就把第
一个给删了。
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int main()
{
string s;
string s1;
string s2;
int i,n,m,j,sum,count,k,p,q;
while(cin>>s)
{
sum=0;
count=0;
int a[300]={0};
int b[300]={0};
for(i=0;i<s.size();i++)
{
a[s[i]]++;
if(a[s[i]]==1)
sum++;
}
k=0;
p=s.size();
for(j=0;j<s.size();j++)
{
b[s[j]]++;
if(b[s[j]]==1)
count++;
if(count>=sum)
{
while(b[s[k]]>1)
{
b[s[k]]--;
k++;
}
if(p>(j-k+1))
p=j-k+1;
}
}
printf("%d\n",p);
}
return 0;
}