/**
* 题目
* 给你一个字符串 s,找到 s 中最长的回文子串。
* 输入:s = "babad"
* 输出:"bab"
* 解释:"aba" 同样是符合题意的答案。
*/
/**
* @param {string} s
* @return {string}
*/
// 中心扩散法
var longestPalindrome = function(s) {
if (s.length < 2) return s
let res = ''
for (let i = 0; i < s.length; i++) {
helper(i, i)
helper(i, i + 1)
}
var helper = function(m, n) {
while(m >= 0 && n <= s.length - 1 && s[m] === s[n]) {
m--
n++
}
// 因为最后一次循环完毕后n--了m++了,所以n,m应该取n-1 m+1的区间,长度为n - m - 1
if (n - m - 1 > res.length) {
res = s.slice(m + 1, n)
}
}
return res
}
// 动态规划
// 状态dp[i][j]以下标i开头j结尾的字串是否是回文串
var longestPalindrome = function(s) {
let res = ''
let len = s.length
let dp = Array.from(Array(len), () => Array(len).fill(false))
// 下半区右下角开始
for (let i = len - 1; i >= 0 ; i--) {
for (let j = i; j < len; j++) {
// 在两个端点相等的情况下,如果长度为1则回文,如果dp[i + 1][j - 1]为true(之前计算过)也为回文
dp[i][j] = s[i] === s[j] && (j - i < 2 || dp[i + 1][j - 1])
if (dp[i][j] && j - i + 1 > res.length) {
res = s.substring(i, j + 1)
}
}
}
return res
}