最长回文子串 Longest Palindromic Substring
题目描述
Given a string s
, return the longest palindromic substring in s
.
Example 1:
Input: s = “babad”
Output: “bab”
Note: “aba” is also a valid answer.
Example 2:
Input: s = “cbbd”
Output: “bb”
Example 3:
Input: s = “a”
Output: “a”
Example 4:
Input: s = “ac”
Output: “a”
Constraints:
- 1 <= s.length <= 1000
- s consist of only digits and English letters.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题方法
方法一:中心扩展法
class Solution {
public:
string palindrome(string s, int l, int r) {
while(l >= 0 && r < s.length() && s.at(l) == s.at(r)) {
l--;
r++;
}
return s.substr(l + 1, r - l - 1);
}
string longestPalindrome(string s) {
string result = "";
for(int i = 0; i < s.length(); i++) {
string s1 = palindrome(s, i, i);
string s2 = palindrome(s, i, i + 1);
result = s1.length() > result.length() ? s1 : result;
result = s2.length() > result.length() ? s2 : result;
}
return result;
}
};
- 时间复杂度:O(n2)。
- 空间复杂度:O(1)。
方法二:动态规划法
class Solution {
public:
string longestPalindrome(string s) {
int n = s.length();
if(n < 2) return s;
vector<vector<int>> dp(n, vector<int>(n));
for(int i = 0; i < n; i++) {
dp[i][i] = true;
}
int start = 0;
int length = 1;
for(int L = 2; L <= n; L++) {
for(int i = 0; i + L - 1 < n; i++) {
int j = i + L - 1;
if(s.at(i) != s.at(j)) {
dp[i][j] = false;
} else {
if(L < 3) {
dp[i][j] = true;
}
else {
dp[i][j] = dp[i + 1][j - 1];
}
}
if(dp[i][j] && L > length) {
length = L;
start = i;
}
}
}
return s.substr(start, length);
}
};
- 时间复杂度:O(n2)。
- 空间复杂度:O(n2)。
注意:本题动态规划非最优解,因为空间复杂度较高。
vector<vector<int>>的初始化方法
vector<vector<int>> table(size1, vector<int>(size2, 0));
- size1: 外围容器的size。
- vector(size2, 0): 外围容器的内容。
- size2: 内部容器的size。
- 0所在的位置为内部容器的内容,初始化时没有特殊需要可以省略。