leetcode 5. 最长回文子串
解题思路
执行用时552ms。
基本思路是动态规划算法,对二维数组进行填表
定义:
i = 左边界
j = 右边界
dp[i][j] = i到j的子串是否为回文子串
由此可得递推公式:dp[i][j] = (dp[i+1][j-1] && s[i] == s[j]) ? true : false
初始化二维数组,遍历二维数组的关键点:以列j
为基准,对行i
进行遍历,并且i < j
。
j = 0 | j = 1 | j = 2 | j = 3 | |
---|---|---|---|---|
i = 0 | true | |||
i = 1 | true | true | ||
i = 2 | true | true | true | |
i = 3 | true | true | true | true |
代码
class Solution {
public:
string longestPalindrome(string s) {
int n = s.size();
if (n < 2) {
return s;
}
vector<vector<bool>> dp(n, vector<bool>(n, false));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i >= j) {
dp[i][j] = true;
}
}
}
int begin = 0;
int maxLen = 0;
for (int j = 1; j < n; j++) {
for (int i = 0; i < j; i++) {
if (dp[i + 1][j - 1] && s[i] == s[j]) {
dp[i][j] = true;
if (j - i + 1 > maxLen) {
begin = i;
maxLen = j - i + 1;
}
} else {
dp[i][j] = false;
}
}
}
if (maxLen == 0) {
return s.substr(0, 1);
} else {
return s.substr(begin, maxLen);
}
}
};