二分 + 双指针
二分长度,然后使用双指针检查是否符合条件
#include <iostream>
#include <string>
using namespace std;
int n;
int cnt[4];
string t;
bool check(int len)
{
fill(cnt, cnt + 4, 0);
for (int i = 0; i < len; ++i) cnt[t[i] - '0'] ++;
if (cnt[1] && cnt[2] && cnt[3]) return true;
for (int i = len; i < t.size(); ++i)
{
cnt[t[i - len] - '0'] --;
cnt[t[i] - '0'] ++;
//cout << cnt[1] << " " << cnt[2] << ' ' << cnt[3] << endl;
if (cnt[1] && cnt[2] && cnt[3]) return true;
}
return false;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
while(n --)
{
fill(cnt, cnt + 4, 0);
cin >> t;
for (auto c : t)
{
cnt[c - '0'] ++;
}
bool flag = true;
for (int i = 1; i <= 3; ++i)
{
if (!cnt[i]) flag = false;
}
if (!flag)
{
cout << 0 << '\n';
continue;
}
int l = 0, r = t.size();
while(l < r)
{
int mid = (l + r) >> 1;
//cout << mid << endl;
if (check(mid)) r = mid;
else l = mid + 1;
}
cout << r << "\n";
}
}