leetcode5: Longest Palindromic substring

150 阅读1分钟

题目描述

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

解题思路

首先想到暴力法,但是肯定不是最好的。于是继续思考,有没有什么更优解。由局部最优达到全局最优(aba是回文,aabaa也是回文)联想到了动态规划,于是采用动态规划来解题。 我们给出 P(i,j)P(i,j) 的定义如下:

P(i,j)=(P(i+1,j−1) and S i ​ ==S 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