第四题 最短子串(short)
【题目描述】
给出字符串S,字符串的每一个字符是’1’或’2’或’3’。你要从S中选取一段连续字符,不妨假设这段连续的字符构成的字符串是T,你的目标是使得T的长度最短,而且字符’1’、’2’、’3’在T中都出现过。如果无法完成目标则输出0,否则输出T的最短长度。
【输入格式】
一个字符串S,长度不超过200000。
【输出格式】
一个整数。
【输入样例】
112233
【输出样例】
4
【提示】
对于60%的分数,S的长度不超过100。
作答区域
#include<bits/stdc++.h>
using namespace std;
string s;
char y;
int x,r,sum,l,p=1,t[10000009],ans=99999999;
int main()
{
cin>>s;
for(int i=0;i<s.size();i++)
{
r=i;
y=s[i];
t[y]++;
if(t[y]==1)x++;
if(x==3)
{
p=0;
for(;;)
{
sum=r-l+1;
if(sum<ans)ans=sum;
y=s[l];
t[y]--;
l++;
if(t[y]==0)
{
x--;
break;
}
}
}
}
if(p==1)cout<<0;
else cout<<ans;
return 0;
}
该程序解决的问题是找出包含字符1、2、3的最短连续子串。它遍历输入字符串,记录每个字符出现的次数,当三个字符都出现时计算子串长度并更新最短长度。如果无法找到包含所有字符的子串,输出0。
625

被折叠的 条评论
为什么被折叠?



