1 条题解

  • 0
    @ 2026-6-19 10:30:33

    📝 题目大意

    给定一个只含 o- 的长度为 NN 的字符串 SS,求 SS 的某个连续子串能构成的"团子字符串"的最大等级。团子字符串定义为:恰好一端是 -、其余 LL 个字符全是 o、长度为 L+1L+1 的字符串(如 ooo--ooo)。若不存在则输出 -1

    💡 解题思路

    1. 题目分析N2×105N \leq 2\times 10^5,需要 O(N)O(N) 的解法。团子字符串的本质是"一段连续的 o,且旁边至少有一个 -"。

    2. 算法推导

      • 首先,若字符串中全为 o 或全为 -,则无法构成任何团子字符串,直接输出 -1(对应 std.cppc1==0 || c2==0 的判断)。
      • 否则,问题转化为:求字符串中最长连续 o 的个数。因为只要存在至少一个 -,最长连续 o 段必然能找到一个相邻的 -(除非最长连续 o 段恰好位于字符串两端且没有相邻 -,但此时因为有 - 存在,必然有某个 o 段旁边有 -,而最长连续 o 段一定不短于该段,且它本身要么在某端要么在中间,总能找到相邻的 -)。
      • 具体实现:遍历字符串,用变量 c 记录当前连续 o 的个数。遇到 - 时,用 c 更新答案 ans,并将 c 清零;遇到 oc++。遍历结束后再用 c 更新一次 ans(处理末尾的连续 o)。
    3. 边界与细节

      • o 或全 - 的情况 → 输出 -1
      • 字符串以 o 结尾时,需要在循环结束后再用 c 更新一次 ansstd.cpp 第 38 行)。
      • 答案至少为 1,因为只要两种字符都有,必然存在至少一个 o 旁边有 -

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N),只需两次遍历字符串(一次统计,一次求最长连续段)。
    • 空间复杂度O(N)O(N),用于存储字符串 SS

    💻 标准代码 (C++)

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 2e5 + 10;
    char s[N];
    int c1 = 0, c2 = 0, c = 0; // c1: 'o'的个数, c2: '-'的个数, c: 当前连续'o'的个数
    int main()
    {
        int n;
        cin >> n;
        cin >> s + 1; // 1-indexed 读入字符串
        // 第一遍扫描:统计两种字符的数量
        for (int i = 1; i <= n; i++)
        {
            if (s[i] == 'o')
            {
                c1++;
            }
            else if (s[i] == '-')
            {
                c2++;
            }
        }
        // 若缺少任何一种字符,无法构成团子字符串
        if (c1 == 0 || c2 == 0)
        {
            cout << -1 << endl;
            return 0;
        }
        c = 0;
        int ans = 0;
        // 第二遍扫描:求最长连续'o'的长度
        for (int i = 1; i <= n; i++)
        {
            if (s[i] == '-')
            {
                ans = max(ans, c); // 遇到'-',结算当前连续'o'的长度
                c = 0;             // 重置计数器
            }
            else
                c++; // 遇到'o',累加
        }
        ans = max(ans, c); // 处理末尾可能的一段连续'o'
        cout << ans << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    712
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    2
    已通过
    1
    上传者