1 条题解
-
0
📝 题目大意
给定一个长度为 的大写英文字符串 ,求其所有连续子串中回文串的最大长度。保证至少存在一个回文子串(单个字符本身即为回文)。
💡 解题思路
- 题目分析:,数据规模极小,直接暴力枚举所有子串并判断回文即可。不需要马拉车等高级算法。
- 算法推导:
- 初始化答案
ans = 1,因为单个字符的子串一定是回文,长度至少为 。 - 外层循环
i枚举子串起点(),内层循环j枚举子串终点(),截取子串s.substr(i, j - i + 1)。 - 将截取的子串反转后与原串比较,若相等则为回文串,用
max更新ans。 - 最终输出
ans。
- 初始化答案
- 边界与细节:
- 子串长度至少为 才需要检查(长度 已通过
ans = 1处理),代码中j从i+1开始,正确。 - 全为相同字符的串(如
AAAAAAAAAA)全部子串均为回文,答案为 。 - 全为不同字符的串(如
ABCDEFG)无长度 的回文子串,答案为 。
- 子串长度至少为 才需要检查(长度 已通过
⏱️ 复杂度分析
- 时间复杂度:。枚举 个子串,每次反转和比较均 。 时约 次操作,完全可行。
- 空间复杂度:,仅需存储子串及其反转副本。
💻 标准代码 (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
- 上传者