思想
发现单调性
每个子序列都是升序或者降序的。
我们用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子序列,我们把这个区间段个数取出来:,然后此时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;
}