Longest Palindrome Substring

题目描述

解题方法

都TLE……

dfs + 记忆化搜索的方法

可以作对,将check isPalindrome的结果存下来,但是过不了时间

正常DP的做法

dp[i][j] 表示s[i:j+1]是会文

转换方程

if j == i + 1and s[i] == s[j]:
    dp[i][j] = True
elif s[i] == s[j] and dp[i+1][j-1]:
    dp[i][j] = True

init status

每个字符自身是一个palindrome

Solution

记忆化搜索的方法

class Solution:
    # @param A : string
    # @return a strings
    def longestPalindrome(self, A):
        s = A
        if not s:
            return ""
        self.s_map = {}
        length = len(s)
        if length == 0 or length == 1:
            return s
        max_length = 1
        max_substring = s[0]

        for i in range(length):
            for j in range(i+1, length):
                if j == i+1 and s[i] == s[j]:
                    if max_length < 2:
                        max_length = 2
                        max_substring = s[i:j+1]
                else:
                    if s[i] == s[j] and self.isPalindrome(s[i+1:j]):
                        if max_length < j - i + 1:
                            max_length = j - i + 1
                            max_substring = s[i:j+1]
        return max_substring

    def isPalindrome(self, s):
        if s in self.s_map:
            return self.s_map[s]

        length = len(s)
        if length == 0 or length == 1:
            self.s_map[s] = True
            return True
        start = 0
        end = length - 1
        while start < end:
            if s[start] != s[end]:
                self.s_map[s] = False
                return False
            start += 1
            end -= 1
        self.s_map[s] = True
        return True

DP

class Solution:
    # @param A : string
    # @return a strings
    def longestPalindrome(self, A):
        s = A
        length = len(s)
        if length == 0 or length == 1:
            return s
        max_length = 1
        max_substring = s[0]

        dp = [[False for i in range(length)] for j in range(length)]
        for i in range(length):
            dp[i][i] = True

        for i in range(length):
            for j in range(i): # order is important!
                if j + 1== i:
                    if s[i] == s[j]:
                        dp[j][i] = True
                        if max_length < 2:
                            max_length = 2
                            max_substring = s[j:i+1]
                else:
                    if s[i] == s[j] and dp[j+1][i-1]:
                        dp[j][i] = True
                        if max_length < i - j + 1:
                            max_length = i - j + 1
                            max_substring = s[j:i+1]
        return max_substring

Reference