
关注让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言问题描述: 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。 示例 2: 输入: "cbbd" 输出: "bb" 代码实现: 方法一:暴力枚举
如果该子串是回文字符串,判断它是否是最长的回文子串,并记录该子串的起点位置和子串长度 代码如下: class Solution { public: string longestPalindrome(string s) { int n = s.length(); if (n == 0) return ""; int start = 0, maxlen = 1; for (int i = 0; i < n; i++) { for (int j = i; j < n; j++) { int len = j - i + 1; if (len > maxlen && isPalindrome(s, i, j)) { start = i; maxlen = len; } } } return s.substr(start, maxlen); }
bool isPalindrome(string s, int left, int right) { while (left < right) { if (s[left] != s[right]) { return false; } left++; right--; } return true; } }; 时间复杂度:O(n^3),暴力枚举所有的子串,每个子串需要判断是否是回文字符串,所以需要 O(n) 的时间复杂度,总时间复杂度为 O(n^3)。 方法二:动态规划
返回最长的回文字符串 代码如下: class Solution { public: string longestPalindrome(string s) { int n = s.length(); if (n == 0) return ""; int maxlen = 1, start = 0; for (int i = 0; i < n; i++) { int len1 = expandAroundCenter(s, i, i); // 奇数长度的回文字符串 int len2 = expandAroundCenter(s, i, i+1); // 偶数长度的回文字符串 int len = max(len1, len2); if (len > maxlen) { maxlen = len; start = i - (maxlen-1)/2; } } return s.substr(start, maxlen); }
int expandAroundCenter(string s, int left, int right) { while (left >= 0 && right < s.length() && s[left] == s[right]) { left--; right++; } return right-left-1; // 注意减一 } }; 时间复杂度:O(n^2),需要遍历整个字符串,以每个字符为中心扩展,同时以每个字符和它右侧的字符为中心扩展,每次扩展需要 O(n) 的时间复杂度,所以总时间复杂度为 O(n^2)。