3624. 三值字符串 知识点:双指针

80 阅读1分钟

思想

3624. 三值字符串 - AcWing题库

发现单调性

每个子序列都是升序或者降序的。

我们用i,j两个指针从0开始,i先走,每次cnt[s[i]]++。

统计一下s[i]='1','2','3'时候cnt['1']cnt['2']cnt['3']的值。

当cnt['1']cnt['2']cnt['3']的个数都是大于1的时候说明至少有一个123子序列,我们把这个区间段个数取出来:ij+1i-j+1,然后此时j可以往后移动一下,即更新区间。继续往下查找包含123的子序列,最后我们对所有的子序列求一个最小值即可。

#include<bits/stdc++.h>
using namespace std;
int cnt[100];
int main()
{
    int t;cin>>t;
    while(t--)
    {
        int res = 0x3f3f3f3f;

        string s;cin>>s;
             memset(cnt,0,sizeof cnt);
 
        for(int i=0,j=0;i<s.size();i++)
        {
           cnt[s[i]]++;
           while(cnt['1']&&cnt['2']&&cnt['3'])
           {
               res=min(res,i-j+1);
              
               cnt[s[j]]--;
               j++;
           }
        }
            if(res==0x3f3f3f3f)cout<<0<<endl;  //res没发生变化 ,说明没有找到s里面不存在连续的123子序列
            else cout<<res<<endl;
        
    }
    

    return 0;
}