题解 | 密码截取
字符串中心扩展:O(n²)
#include <iostream> using namespace std; int expandAroundCenter(const string& s, int left, int right) { // 从中心向两边扩展查找回文 while (left >= 0 && right < s.size() && s[left] == s[right]) { left--; right++; } return right - left - 1; // 返回回文长度 } int main() { string s; getline(cin, s); if (s.empty()) return 0; int max_len = 0; //遍历所有可能的中心点 for (int i = 0; i < s.size(); ++i) { // 处理奇数长度 int len1 = expandAroundCenter(s, i, i); // 处理偶数长度 int len2 = expandAroundCenter(s, i, i + 1); int curr_max = max(len1, len2); if (curr_max > max_len) { max_len = curr_max; } } cout << max_len; return 0; }
遍历字符串再判断回文O(n³):
会超时
#include <cctype> #include <cstring> #include <iostream> #include <string> using namespace std; //判断回文 bool isCycleString(const string& s){ string tmp; for(auto it = s.rbegin();it != s.rend();it++){ tmp += *it; } return s == tmp; } int main() { string s; getline(cin, s); if (s.empty()) return 0; int max_len = 0; string tmp; //遍历截取所有字符串并判断回文 for(int i = 0;i < s.size();++i){ for(int j = 1;j <= s.size();++j){ tmp = s.substr(i,j); if(isCycleString(tmp)){ if(max_len < tmp.size()) max_len = tmp.size(); } } } cout<<max_len; }