题目描述
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
解题思路
首先想到暴力法,但是肯定不是最好的。于是继续思考,有没有什么更优解。由局部最优达到全局最优(aba是回文,aabaa也是回文)联想到了动态规划,于是采用动态规划来解题。 我们给出 P(i,j)P(i,j) 的定义如下:

代码
JS版
var longestPalindrome = function (s) {
let result = "";
let P = [];
let n = s.length;
for(let i = n - 1; i >= 0; i--){
for(let j = n - 1; j >= i; j--){
P[j] = s.charAt(i) == s.charAt(j) && (j - i < 3 || P[j - 1]);
if(P[j] && j - i + 1 > result.length){
result = s.slice(i, j + 1);
}
}
}
return result;
};
PY版
class Solution:
def longestPalindrome(self, s: str) -> str:
size = len(s)
if size <= 1:
return s
dp = [[False for _ in range(size)] for _ in range(size)]
longest_l = 1
res = s[0]
for r in range(1, size):
for l in range(r):
if s[l] == s[r] and (r - l <= 2 or dp[l + 1][r - 1]):
dp[l][r] = True
cur_len = r - l + 1
if cur_len > longest_l:
longest_l = cur_len
res = s[l:r + 1]
return res