PS:第一次写题解
根据题意我们可以先得出一个情况:
- 当字符串的长度小于26时,铁定不会得到t包含a-z的所有字母的条件
因为要满足a-z的所有字母都在子串t中,因此,我们可以专门定义一个长度为27的数组要记录每一个字母的状态,以及定义一个变量记录已经出现字母的数量,同上定义一个变量记录子串长度,此时我们分情况讨论:
-
当该字母未出现时,我们可以令记录该字母的位置+1,出现字母数量+1
-
当该字母已经出现过,我们只需记录该字母的位置+1
-
当总字母已经出现过26个时,我们可以从给出字符串开头遍历,每次便利时,更新最短子串长度,并在记录该位置的所代表的字母的数目-1,此时我们继续分情况讨论:
-
如果该位置的数目>0,我们可以进行对已经遍历了的字符串段的长度进行-1操作
-
如果该位置的数目等于0,我们可以对总字母数量-1,
最后得出的便是最短子串长度
#include<bits/stdc++.h>
using namespace std;
string s;
int a[27],sum=0,ans=1e9;
int main(){
cin>>s;
if(s.length()<26){
cout<<-1;
return 0;
}
for(int i=0,j=0;j<s.length();j++){
if(a[s[j]-'a']==0)sum++;
a[s[j]-'a']++;
while(sum==26){
ans=min(ans,j-i+1);
a[s[i]-'a']--;
if(a[s[i]-'a']==0)sum--;
i++;
}
}
cout<<ans;
}
我是蒟蒻,原各位佬指点指点!!!