思路,维护一个含有123字符的滑动窗口
如果含有123字符的话,并且移动后还含有123字符的话,我们将左端点左移
#include <bits/stdc++.h>
using namespace std;
int main(){
int t;
cin >> t;
while(t--){
string s;
cin >> s;
//含123的最短子串
//维护一个滑窗,里面含123字符,
int a[3];
a[0] = a[1] = a[2] = 0;
int ans = INT_MAX;
int n = s.size();
for(int i = 0, j = 0;i < n; ++i){
if(s[i] == '1') ++a[0];
else if(s[i] == '2') ++a[1];
else ++a[2];
if(a[0] && a[1] && a[2]) ans = min(ans, i - j + 1);
while(a[0] + a[1] + a[2] > 3 && a[s[j] - '1'] > 1 ){ a[s[j++] - '1'] --;
if(a[0] && a[1] && a[2]) ans = min(ans, i- j + 1);
}
}
cout << (ans == INT_MAX? 0: ans) << endl;
}
return 0;
}