描述
"你叉叉,唱日出,穷哈哈,唱日落.....",小哈开心地哼着小调,因此小哈是一个爱笑的人,每次笑都很有魔性,调皮地小哼记录了小哈的一次说的话,其中里面可能包含了小哈的笑声,并以为字符串来记录小哈的话。已知,小哈的笑声是字母aa和hh交替的序列,例如:ahahahahahah,ahaaha,aa,hh是符合笑声的合法序列。但是,abacabaabacaba,aaaa不符合笑声的合法序列。
通过小哼的记录,请你求出小哈笑声的最大长度。
输入描述:
输入的第一行给出小哈说话的长度N。
随后一行中输入一行长度为N字符串S——表示小哈的话。
1≤N≤1e5
S仅由小写字母组成。
输出描述:
输出小哈笑声的最大长度。
思路:
这是一个经典的使用if-else结构的分类讨论题,给出一个序列a b h a h a h,对其进行线性遍历找到最大ah交替序列,我们对current_len和max_len进行更新维护。
对于每个字符:
1、如果它不是a或者h,那么笑声序列中断,current_len重置为0 ->if(s[i]!='a'||s[i]!='h'
2、(1)如果它是a或者h,因为前面遇到的都不是a或者h,所以笑声序列从此处开始,置current_len为1 ->if(current_len == 0)
2、(2)如果它是a或者h但是并不是交替的(aa/hh),那么current_len重新置为1 ->else if(current_len == 1)->if s[i]与s[i-1]
2、(3)如果它是a或者h且满足交替,那么current_len加1 ->else if(current_len == 1)->if s[i]与s[i-1]
只要进入2、情况,那么就要对max_len和current_len进行比较并更新max_len
#include <algorithm>
#include <iostream>
using namespace std;
int main() {
int N;
string s;
cin >> N >> s;
int max_len = 0, current_len = 0;
for (int i = 0; i < N; i++) {
if (s[i] != 'a' && s[i] != 'h') {
current_len = 0;
}
else {
if (current_len == 0) {
current_len = 1;
}
else if (current_len >= 1) {
if ((s[i-1] == 'a' && s[i] == 'a') || (s[i-1] == 'h' && s[i] == 'h')) {
current_len = 1;
}
else if ((s[i-1] == 'a' && s[i] == 'h') || (s[i-1] == 'h' && s[i] =='a')) {
current_len++;
}
}
max_len = max(current_len, max_len);
}
}
cout << max_len;
}

京公网安备 11010502036488号