解题思路

一个字符串 S 的子串 T 是合法的,当且仅当 T 中包含了所有的小写字母。求所有的合法的 S 的子串中,长度最短是多少。

尺取法:滑动窗口、双指针。
确定一个区间,表示一个子字符串 T,如果 T 合法,计算此时的子串长度,更新最短长度,将 右移;否则将 右移。

C++代码

#include<iostream>
using namespace std;

int cnt[26];

bool isLegal(){
    for(int i=0; i<26; ++i){
        if(cnt[i] < 1)
            return false;
    }
    return true;
}

int main(){
    string s;
    cin >> s;
    int n = s.size();
    int i = 0;
    int j = 0;
    while(j < n){
        int pos = s[j] - 'a';
        cnt[pos] += 1;
        if(isLegal())
            break;
        ++j;
    }
    int ans = j - i + 1;
    while(i < n && j < n){
        if(isLegal()){
            ans = min(ans, j-i+1);
            int pos = s[i] - 'a';
            cnt[pos] -= 1;
            ++i;
        }
        else{
            ++j;
            if(j == n)
                break;
            int pos = s[j] - 'a';
            cnt[pos] += 1;
        }
    }
    cout << ans << endl;
    return 0;
}