top1编程
← 返回题目
题解

最长字符平台

1 条题解

  • 0
    @ 2026-8-5 10:24:13

    解题思路

    题目里的字符数组已经按 ASCII 码从小到大排好序了,所以相同的字符一定紧紧挨在一起,排成连续的一段。我们的任务就是找到最长的一段"连续相同字符",它就叫最长字符平台。

    怎么找呢?我们可以从头到尾扫一遍,用一个"计数器"记录当前这一串相同字符有多长:

    • 看下一个字符,如果它和当前字符一样,计数器就加 1,说明平台还在变长;
    • 如果它和当前字符不一样,说明上一串结束了,重新以这个新字符开始,计数器从 1 数起。

    每走一步,都要把当前这串的长度和"目前找到的最长长度"比一比。如果更长,就把它记下来(包括长度和这个字符)。

    注意题目要求:如果有多个一样长的最长平台,要找先出现的那个。所以只有当前长度严格大于之前记录的长度时才更新;如果相等,就不更新,这样保留下来的永远是第一个出现的最长平台。

    参考代码

    // P4510 最长字符平台:在有序字符序列中找最长的连续相同字符段
    #include <iostream>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
        char ch;
        cin >> ch;        // 先读入第一个字符
        char cur = ch;    // 当前正在统计的字符
        int len = 1;      // 当前字符连续出现的长度
        int bestLen = 1;  // 找到的最长平台长度
        char bestCh = ch; // 最长平台对应的字符
    
        for (int i = 2; i <= n; i++) {
            cin >> ch;
            if (ch == cur) {
                len++;     // 和上一个字符相同,平台继续加长
            } else {
                cur = ch;  // 遇到新字符,开始新平台
                len = 1;
            }
            if (len > bestLen) {  // 只有严格更大才更新,保证取先出现的
                bestLen = len;
                bestCh = cur;
            }
        }
    
        cout << bestLen << endl;
        cout << bestCh << endl;
        return 0;
    }
    

    复杂度分析

    我们只把 n 个字符从头到尾看了一遍,所以时间复杂度是 O(n)。只用几个变量来记录状态,不随 n 增加而增加,所以空间复杂度是 O(1)。

    • 1