解题思路
一个字符串 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;
} 
京公网安备 11010502036488号