B. Ternary String(尺取法)

B. Ternary String

题意:给一个只含1,2,3的字符串,求包含这三个数的最小区间。
思路:尺取法。
两个变量 i , j i, j ij,表示区间的起点和终点。
起点从0开始—— i = 0 , j = 0 , [ 1 ] j i=0,j=0,_{[1]}j i=0j=0[1]j一直递增直到找到一个满足条件的区间,然后轮到 i i i递增了,区间开始缩小,找到 j j j位置下,满足条件的区间的最小长度,直到区间 [ i , j ] [i,j] [i,j]不再满足条件。然后重复上面的工作 [ 1 ] _{[1]} [1],直到 j = 字 符 串 . l e n j=字符串.len j=.len

#include<bits/stdc++.h>
using namespace std;
const int INF = 0x7ffffff;
char s[200010];
int c[4];//存1,2,3。区间判断是否满足条件
int main() {
    
    
	int t;
	cin >> t;
	while(t--) {
    
    
		memset(c, 0, sizeof c);
		cin >> s;
		int i = 0, j = 0, len = strlen(s), mi = INF;
		while(j < len) {
    
    //退出条件
			c[s[j]-'0']++;//对区间内的1,2,3计数,方便判断
			while(c[1] && c[2] && c[3] && i < j) {
    
    //i递增过程
				mi = min(mi, j-i+1); //找最小区间
				c[s[i]-'0']--, i++;
			}
			j++;//j递增。
		}
		if(mi != INF) cout << mi << endl;//判断是否存在满足条件的区间。
		else cout << 0 << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45363113/article/details/106878114