【Leetcode-算法-Python3】5. 最长回文子串

1. 暴力法

思路:对每一个子串判断是否回文


class Solution:

    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        if len(s) == 1:
            return s
        re = s[0]
        for i in range(0,len(s)-1):
            for j in range(i+1,len(s)):
                sta = i
                end = j
                flag = True
                while sta < end:
                    if s[sta] != s[end]:
                        flag = False
                        break
                    sta += 1
                    end -= 1
                if flag and j-i+1 > len(re):
                    re = s[i:j+1]

        return re

提交结果:超出时间限制

2. 动态规划法-1

思路

m[i][j]标记从第i个字符到第j个字符构成的子串是否回文,若回文值为True,否则为False.

初始状态 s[i][i] == True,其余值为False.

当 s[i] == s[j]  and m[i+1][j-1] == True 时,m[i][j] = True


class Solution:
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        k = len(s)
        matrix = [[False for i in range(k)] for j in range(k)]  
        re = s[0:1]
        for i in range(k):
            for j in range(k):
                if i==j:
                    matrix[i][j] = True
        for t in range(1,len(s)):             #分别考虑长度为2~len-1的子串(长串依赖短串的二维数组值)
            for i in range(k):
                j = i+t
                if j >= k: 
                    break
                if i+1 <= j-1 and matrix[i+1][j-1]==True and s[i] == s[j]:
                    matrix[i][j] = True
                    if t+1 > len(re):
                        re = s[i:j+1]
                elif i+1 == j and j-1 == i and s[i] == s[j]:
                    matrix[i][j] = True
                    if t+1 > len(re):
                        re = s[i:j+1]
        return re

执行用时:8612 ms




你可能感兴趣的:(Leetcode)