5. 最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。 示例 2:
输入: "cbbd"
输出: "bb"
解答:
问题解读,找出字符串中最长的回文子串。回文子串就是对称的字符串。
动态规划:(分割小问题,连续执行。找到最优解)
- 创建一个二维数组,默认状态为false;
- 碰到回文就存起状态true;
- 根据前面短的回文判断后面是否还有回文;
- 存起最长的字符串。
var longestPalindrome = function(s) {
let dp = Array.from({length: s.length}, () => new Array(s.length).fill(false));
let res = "";
for(let i=0; i<s.length; i++) {
//从遍历过的字符串往前找
for(let j=i; j>=0; j--) {
//s[i]===s[j]的前提下,i-j<2判断是否是连续的两个字符串
//判断前面小范围是否是回文,推断后面是否能够回文
dp[j][i] = s[i]===s[j] && (i-j<2 || dp[j+1][i-1]);
if(dp[j][i] && i-j+1 > res.length) {
res = s.substring(j, i+1);
}
}
}
return res;
}