A27716. 字符串(str)问题描述已知一串由大小写英文字母构成的串,请找出其中连续一段全部由小写英文字母构成的最长子串,再找出其中连续一段全部由大写英文字母构成的最长子串。另外若删除串中的一个字母,则剩余串中连续一段全是小写字母或全是大写字母构成子串的最大长度是多少?
填空题
中等
知识点
题目描述
字符串(str)
问题描述
已知一串由大小写英文字母构成的串,请找出其中连续一段全部由小写英文字母构成的最长子串,再找出其中连续一段全部由大写英文字母构成的最长子串。
另外若删除串中的一个字母,则剩余串中连续一段全是小写字母或全是大写字母构成子串的最大长度是多少?
输入格式
一行,一个由大小写英文字母构成的串。
输出格式
三行。
第一行一个数,表示最长连续一段全是由小写英文字母构成的子串的长度。
第二行一个数,表示最长连续一段全是由大写英文字母构成的子串的长度。
第三行一个数,表示删除一个字母后,最长连续一段全是由小写英文字母或全是由大写英文字母构成的子串的长度。
样例输入
HelloWorld
样例输出
4
1
8
样例解释
原串中连续一段由小写字母构成的子串最长的为:ello或orld,长度都为4。
原串中连续一段由大写字母构成的子串最长的为:H或W,长度都为1。
去掉原串中的第6个字母W,剩余串的为Helloorld,所以最长连续一段是elloorld全是由小写字母构成,长度为8。
数据范围及限制
对于20%的数据,原串全是由小写字母或全是由大写字母构成。
对于另外20%的数据,原串中仅有一个大写字母或仅有一个小写字母。
对于另外30%的数据,原串的长度不超过10000.
对于100%的数据,原串的长度不超过1000000。
参考答案
#include<bits/stdc++.h>
using namespace std;
int a[1000000+5],n;//0小写 1大写 下标1-n
int b[1000000+5],xb=0;
string s;
int main()
{
memset(a,-1,sizeof(a));
cin>>s;
n=s.size();
for(int i=0;i<n;i++)
{
if(s[i]>='a' && s[i]<='z') a[i+1]=0;
else a[i+1]=1;
}
int s1=1,s2=1,m1=0,m2=0;
for(int i=1;i<=n;i++)
{
if(a[i]==0)//小写
{
if(a[i+1]==0) s1++;
else
{
b[++xb]=s1;
m1=max(m1,s1);
s1=1;
}
}
else //大写
{
if(a[i+1]==1) s2++;
else
{
b[++xb]=s2;
m2=max(m2,s2);
s2=1;
}
}
}
cout<<m1<<endl<<m2<<endl;
if(m1==n || m2==n)
{
cout<<n-1;return 0;
}
//for(int i=1;i<=xb;i++) cout<<b[i]<<" ";
int ans=0;
for(int i=1;i<xb;i++)
{
if(b[i]==1)
{
int t=b[i-1]+b[i+1];
ans=max(ans,t);
}
}
int t1=max(m1,m2);
ans=max(ans,t1);
cout<<ans;
return 0;
}
上一题
下一题