AcWing 3624. 三值字符串
原题链接
简单
作者:
不幸到吃土
,
2024-12-29 23:02:38
,
所有人可见
,
阅读 2
/*
设当前序列左端点为j,右端点为i,其中j表示"离i最近且与当前a[i]元素不重复"的位置
在右端点后移的过程(i++),判断新加入序列的元素是否与a[i]元素重复:若重复,则当前序列区间(j,i)必不为最短区间
故此时将左端点后移(j++),从而不断缩小序列区间,并判断逐步缩小的子序列是否仍有重复元素
对于每次i++,均判断当前序列内是否已满足成立条件:1、2、3均存在
*/
#include <iostream>
#include <cstring>
using namespace std;
const int N = 200010, INF = 1e9;
char s[N];
int cnt[4]; //用于表示当前序列中1、2、3元素的个数
int main(){
int T;
cin >> T;
while(T--){
cin >> s;
int len = strlen(s);
for(int i=0;i<4;i++){ //每次询问,均重置cnt数组
cnt[i] = 0;
}
int res = INF; //可能存在整个字符串即为答案的情况:s = 123,故初始化为无穷
for(int i=0,j=0;i<len;i++){
cnt[s[i]-'0']++;
while(cnt[s[j]-'0'] > 1){
cnt[s[j]-'0']--;
j++;
}
if(cnt[1] && cnt[2] && cnt[3])
res = min(res,i-j+1);
}
if(res == INF)
res = 0;
cout << res << endl;
}
return 0;
}
由于是char型数据,故需 -‘0‘ 处理