Ternary String(cf 1354B)

给你一串字符串  找出最短的含有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;
}

猜你喜欢

转载自blog.csdn.net/weixin_53013914/article/details/120432759
今日推荐