思路:双指针法
统计 i j 指针之间的 1 2 3 的数量。
如果有个数的数量小于 1 ,j往后移动一位。并且如果移动后的j指向的数字出现次数大于1且与i指向的数字相同,i指针往后移动一位。
当i j 之间的 1 2 3 出现次数都大于等于1的时候,j - i + 1 就是长度。记录下来。
然后从i 的后一位重新寻找。直到 j 指向字符串末尾。
所有长度的最小值就是答案。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int cnt[4];//记录各个数字出现次数
int main()
{
int t;
cin >> t;
while(t--)
{
int ans = 0x3f3f3f3f;
string s;
cin >> s;
int n = s.size();
if(n < 3)
{
cout << 0<< endl;
continue;
}
memset(cnt, 0, sizeof cnt);
int i = 0, j = 0;
while(j < n)
{
cnt[s[j] - '0']++;
if(i != j && s[j] == s[i])
{
cnt[s[i] - '0']--;
i++;
}
if(cnt[1] >= 1 && cnt[2] >= 1 && cnt[3] >= 1)
{
ans = min(ans, j - i + 1);
j = i + 1;
i = j;
memset(cnt, 0, sizeof cnt);
}
else
j++;
}
if(ans == 0x3f3f3f3f) cout << 0 << endl;
else
cout << ans << endl;
}
return 0;
}