LeetCode 5 最长回文子串#
目录#
1. 题目描述#
1.1. Limit#
Time Limit: 1000 ms
Memory Limit: 131072 kB
1.2. Problem Description#
给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
1.3. Sample Input 1#
输入: "babad"
1.4. Sample Output 1#
输出: "bab"
注意: "aba" 也是一个有效答案。
1.5. Sample Input 2#
输入: "cbbd"
1.6. Sample Output 2#
输出: "bb"
1.7. Source#
2. 解读#
dp[i][j]
表示s[i , j + 1]
这个子串是不是一个回文串。len = j - i
,len + 1
表示子串的长度。
- 若
len == 0
,即长度为1
,都满足回文串条件。 - 若
len = 1
,即长度为2
,当首尾相等时满足条件,dp[i][j] = 1
,不相等时dp[i][j] = 0
。 - 若
len >= 2
,即长度大于等于3
,首尾相等时递推计算,不相等时dp[i][j] = 0
。
递推方程 dp[i][j] = dp[i + 1][j - 1]
,表示如果子串 buf = s[i , j + 1]
首位相等,则只要去掉buf
的首尾端点后的子串 s[i + 1 , j]
是回文串,那么buf
一定是回文串。
代码参考自官方题解。
3. 代码#
class Solution {
public:
string longestPalindrome(string s) {
const int MAXM = 1e3 + 1;
int dp[MAXM][MAXM] = { { 0 } };
int n = s.size();
string ans;
// 遍历长度len
for (int len = 0; len < n; ++len) {
// 遍历位置i
for (int i = 0; i + len < n; ++i) {
// 获取结束位置j
int j = i + len;
// 判断长度
if (len == 0) {
// 若len = 0,即长度为1,都满足条件
dp[i][j] = 1;
} else if (len == 1) {
// 若len = 1,即长度为2,当首尾相等时满足条件
dp[i][j] = (s[i] == s[j]);
} else {
// 长度大于等于3,首尾相等时递推计算
// 首尾不相等时默认为false
dp[i][j] = (s[i] == s[j] && dp[i + 1][j - 1]);
}
// 获取最大长度
if (dp[i][j] && len + 1 > ans.size()) {
ans = s.substr(i, len + 1);
}
}
}
return ans;
}
};
联系邮箱:curren_wong@163.com
CSDN:https://me.csdn.net/qq_41729780
知乎:https://zhuanlan.zhihu.com/c_1225417532351741952
公众号:复杂网络与机器学习
欢迎关注/转载,有问题欢迎通过邮箱交流。