三值字符串【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';
    }
}
posted @   Keith-  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示