2022河南萌新联赛第(四)场:A.ZZULI(字符串)
https://ac.nowcoder.com/acm/contest/38487
题目描述
给定一个由任意大写字母组成的字符串 s ,起初 s 的每一个位置都是独立的。现在你要根据 'ZZULI' 规则对位置进行连接。
'ZZULI' 规则如下:
对于两个下标 i,j (i<j),对于
s[i]=='Z'时,s[j]=='Z'||'U'||'L'||"I";
s[i]=='U'时,s[j]=='U'||'L'||'I'
s[i]=='L'时,s[j]=='L'||'I'
s[i]=='I'时,s[j]=='I'
**只有在这些情况下,i 与 j 可以相连。**
求连完边后**最大连通块**的大小。
示例1
输入
IABZUZU
输出
4
最大连通块内的位置为 {4,5,6,7}
示例2
输入
ILIL
输出
4
最大连通块内的位置为{1,2,3,4}
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
string a="ZULI";//这道题目的实际要求就是求ZULI的非连续的最长子序列
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
string s;
cin>>s;
map<char,int> mp;
for(int i=0;i<s.size();i++)
{
mp[s[i]]++;//记录每一种字符的个数
}
int maxn=1;//题目只是要求了连通块,表明是ZULI的形式才可以往后接,但是单独一个的时候就没有要求,所以最短的个数就是一个
//为什么是3欸?因为字符串a的长度是4,最小的那个也就是第三个:I
for(int idx=3;idx>=0;idx--)//这里遍历的就是字符串a长度,指的是每次从哪个字符串出发能够得到的最长子序列
{
int j=idx,sum=0;
for(int i=s.size()-1;i>=0;i--)//扫一遍这个字符串s,找一找我们需要的最长长度
{
if(j<0) break;//如果都直接搜到a的外边去了,赶紧退出来哇
if(s[i]==a[j])
{
sum+=mp[a[j]];
j--;//找到了就可以往前退
}
}
cout<<sum<<endl;
maxn=max(maxn,sum);
}
cout<<maxn<<endl;
return 0;
}