classSolution { public: string longestPalindrome(string s){ int begin = 0, end = 0; int n = s.size(); for(int i = 0; i < n; ++i){ vector<int> interval1 = expand(s, i, i); vector<int> interval2 = expand(s, i, i + 1); if(interval1[1] - interval1[0] > end - begin){ end = interval1[1]; begin = interval1[0]; } if(interval2[1] - interval2[0] > end - begin){ end = interval2[1]; begin = interval2[0]; } } returnstring(s.begin() + begin, s.begin() + end + 1);
} vector<int> expand(string& s, int left, int right){ int n = s.size(); while(left >= 0 && right < n && s[left] == s[right]){ left--; right++; } return {left + 1, right - 1}; } };
classSolution { public: string longestPalindrome(string s){ int n = s.size(); if (n < 2) { return s; }
int maxLen = 1; int begin = 0; // dp[i][j] 表示 s[i..j] 是否是回文串 vector<vector<int>> dp(n, vector<int>(n)); // 初始化:所有长度为 1 的子串都是回文串 for (int i = 0; i < n; i++) { dp[i][i] = true; } // 递推开始 // 先枚举子串长度 for (int L = 2; L <= n; L++) { // 枚举左边界,左边界的上限设置可以宽松一些 for (int i = 0; i < n; i++) { // 由 L 和 i 可以确定右边界,即 j - i + 1 = L 得 int j = L + i - 1; // 如果右边界越界,就可以退出当前循环 if (j >= n) { break; }