描述

"你叉叉,唱日出,穷哈哈,唱日落.....",小哈开心地哼着小调,因此小哈是一个爱笑的人,每次笑都很有魔性,调皮地小哼记录了小哈的一次说的话,其中里面可能包含了小哈的笑声,并以为字符串来记录小哈的话。已知,小哈的笑声是字母aahh交替的序列,例如:ahahahahahahahaaha,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;
}