给你一串字符串 找出最短的含有1、2、3字符的子串
#include"bits/stdc++.h"
using namespace std;
string s;
int n;
// 判断是否出现 1 2 3 字符
bool ss(int x){
if(s[x] != s[x-1] && s[x-1] != s[x-2] && s[x] != s[x-2]){
return true;
}
return false;
}
int main()
{
ios::sync_with_stdio(false);
cin >> n;
while(n--)
{
cin >> s;
int len = s.size();
int ans_a = 0,ans_b = 0, ans_c = 0,f=0; //ans 统计个数
int ip_a = -1 ,ip_b = -1 , ip_c = -1 , cnt = 200005; // ip 表示位置
for(int i=0 ; i < len ; i++){ // cnt 找出最小长度
if(s[i] == '1') ans_a++,ip_a=i; // 当找到3个 用最大减最少就是包含的子串
else if(s[i] == '2') ans_b++,ip_b=i;
else ans_c++,ip_c=i;
if(i>1 && ss(i)){ //找到直接结束,减少时间
f=1;
break;
} // ip需要不断的更新 以便找到最短的
if(ip_a != -1 && ip_b != -1 && ip_c != -1){
int sum_max = max(ip_a,ip_b);
sum_max = max(sum_max,ip_c);
int sum_min = min(ip_a,ip_b);
sum_min = min(sum_min,ip_c);
cnt = min(sum_max-sum_min+1,cnt);
}
}
if(f == 1) cout << 3 << endl;
else{
if(ans_a == 0 || ans_b == 0 || ans_c == 0) cout << 0 << endl;
else{
cout << cnt << endl;
}
}
}
return 0;
}