三值字符串【CF1354B】
三值字符串
给定一个字符串 s,其中的每个字符都是 1,2 或 3。
请你求出同时包含字符 1,2,3 的 s 的最短子串的长度。
注意,子串必须是连续的。
输入格式
第一行包含整数 T,表示共有 T 组测试数据。
每组数据占一行,包含一个字符串 s,保证 s 中可能包含字符 1,2 或 3。
输出格式
每组数据输出一行,一个整数,表示符合条件的最短子串的长度。
如果不存在符合条件的子串,则输出 0。
数据范围
1≤T≤20000,
1≤|s|≤2×105,
所有 T 个输入字符串的长度之和保证不超过 2×105。
输入样例:
7
123
12222133333332
112233
332211
12121212
333333
31121
输出样例:
3
3
4
4
0
0
4
思路
双指针取长度
注意对双指针的精确定义
j:元素在区间内对答案有贡献(不冗余)
通过每次移动i在维护j得到长度i-j+1取min即为答案
代码
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int cnt[4];
int main(){
int t;
cin >> t;
while(t -- ){
string s;
cin >> s;
memset(cnt,0,sizeof cnt);
int ans = 200010;
for(int i = 0,j = 0; i <= s.size() - 1; i ++ ){
cnt[s[i]-'0']++;
while(cnt[s[j] - '0'] > 1)cnt[s[j ++] - '0'] --;
if(cnt[1] && cnt[2] && cnt[3])ans = min(ans,i-j+1);
}
if(ans == 200010)cout << 0 << '\n';
else cout << ans << '\n';
}
}

浙公网安备 33010602011771号