【LeetCode精选TOP面试题】5-最大回文串
2022/03/09 17:24:20
给你一个字符串 s,找到 s 中最长的回文子串。
动态规划解法
思路
用 dp[i][j]
表示从 i-j
是否能形成回文串。
倒着遍历可以简化操作, 这么做的原因是 dp[i][..]
依赖于 dp[i + 1][..]
。
对 dp[i][j]
的值有三种情况可以为 true
:
j - i === 0
当前位可作为一个单字符的回文串。j - i === 1 && s[i] === s[j]
相邻的两个数相同时可作为一个双字符的回文串。s[i] === s[j] && dp[i+1][j-1]
更远位数时两端字符相同且两端向内一位的字符串是一个回文串dp[i+1][j-1]
。
代码
var longestPalindrome = function (s) {
if (!s || s.length === 0) return "";
let res = s[0];
let dp = [];
// 倒着遍历简化操作, 这么做的原因是dp[i][..]依赖于dp[i + 1][..]
for (let i = s.length - 1; i >= 0; i--) {
dp[i] = [];
for (let j = i; j < s.length; j++) {
if (j - i === 0) {
// 同位
dp[i][j] = true;
} else if (j - i === 1 && s[i] === s[j]) {
// 前后两位
dp[i][j] = true;
} else if (s[i] === s[j] && dp[i + 1][j - 1]) {
// 更远位
dp[i][j] = true;
}
if (dp[i][j] && j - i + 1 > res.length) {
res = s.slice(i, j + 1);
}
}
}
return res;
};
let result = longestPalindrome("babad");
console.log(result);