解题思路
- 遍历字符串的每个字符,如果当前字符是
a 或 h,就尝试从这个位置开始向后寻找最长的交替笑声。 - 用指针
j 从当前字符的下一个位置开始向后扫描,每次检查当前字符与下一个字符是否构成 a 和 h 的交替(即不同)。
如果交替成立,就继续向后移动指针,并累加长度。 - 一旦遇到无法交替的情况(比如相同的字母相邻,或者遇到不是
a/h 的字符),就停止当前这一轮的寻找。 - 记录下每一轮找到的交替笑声长度,取最大值作为答案。
注意
- 每次找到一段合法的交替序列后,外层循环的
i 会随着内层指针 j 一起移动,避免重复检查。 - 代码只关心连续的交替序列,不要求子序列(即不能跳过字符),因此适用于本题中“笑声必须连续”的要求(如果题目允许不连续,则上述代码不适用)。
#include <iostream>
using namespace std;
int main() {
int n;cin>>n;
string s;cin>>s;
int cnt = 0, mx = 0;
for(int i = 0;i < s.size();++i){
if(s[i] == 'a' || s[i] == 'h'){
cnt = 1;
for(int j = i + 1;j < s.size();){
if(s[j] == 'h' && s[i] == 'a' ||
s[j] == 'a' && s[i] == 'h'
){
j++;i++;
cnt++;
}else{
break;
}
}
mx = max(mx, cnt);
}
}
cout<<mx<<endl;
}
// 64 位输出请用 printf("%lld")