PS:第一次写题解

根据题意我们可以先得出一个情况:

  • 当字符串的长度小于26时,铁定不会得到t包含a-z的所有字母的条件

因为要满足a-z的所有字母都在子串t中,因此,我们可以专门定义一个长度为27的数组要记录每一个字母的状态,以及定义一个变量记录已经出现字母的数量,同上定义一个变量记录子串长度,此时我们分情况讨论:

  1. 当该字母未出现时,我们可以令记录该字母的位置+1,出现字母数量+1

  2. 当该字母已经出现过,我们只需记录该字母的位置+1

  3. 当总字母已经出现过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;
}

我是蒟蒻,原各位佬指点指点!!!