1 条题解

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

    📝 题目大意

    给定一个长度为 21002 \sim 100 的大写英文字符串 SS,求其所有连续子串中回文串的最大长度。保证至少存在一个回文子串(单个字符本身即为回文)。

    💡 解题思路

    1. 题目分析n100n \le 100,数据规模极小,直接暴力枚举所有子串并判断回文即可。不需要马拉车等高级算法。
    2. 算法推导
      • 初始化答案 ans = 1,因为单个字符的子串一定是回文,长度至少为 11
      • 外层循环 i 枚举子串起点(0n10 \sim n-1),内层循环 j 枚举子串终点(i+1n1i+1 \sim n-1),截取子串 s.substr(i, j - i + 1)
      • 将截取的子串反转后与原串比较,若相等则为回文串,用 max 更新 ans
      • 最终输出 ans
    3. 边界与细节
      • 子串长度至少为 22 才需要检查(长度 11 已通过 ans = 1 处理),代码中 ji+1 开始,正确。
      • 全为相同字符的串(如 AAAAAAAAAA)全部子串均为回文,答案为 nn
      • 全为不同字符的串(如 ABCDEFG)无长度 2\ge 2 的回文子串,答案为 11

    ⏱️ 复杂度分析

    • 时间复杂度O(n3)O(n^3)。枚举 O(n2)O(n^2) 个子串,每次反转和比较均 O(n)O(n)n100n \le 100 时约 10610^6 次操作,完全可行。
    • 空间复杂度O(n)O(n),仅需存储子串及其反转副本。

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    int main() {
        string s;
        cin >> s;
        int n = s.length();
        int ans = 1;  // 单字符子串一定是回文,最小答案为 1
        for (int i = 0; i < n; i++) {          // 枚举子串起点
            for (int j = i + 1; j < n; j++) {  // 枚举子串终点(长度 >= 2)
                string substr = s.substr(i, j - i + 1);  // 截取子串
                string rev_substr = substr;
                reverse(rev_substr.begin(), rev_substr.end());  // 反转得到逆串
                if (substr == rev_substr) {  // 原串与逆串相等即为回文
                    ans = max(ans, (int)substr.length());  // 更新最大长度
                }
            }
        }
        cout << ans << endl;
        return 0;
    }
    
    • 1

    信息

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