力扣5题 最长回文子串

最长回文字符串

class Solution:
    def longestPalindrome(self,s):
        if not s: return 0,None                                     #边界,字符为空
        if len(s) <= 1: return 1,s                                  #边界,只有一个
        dp = [[False for _ in range(len(s))]for _ in range(len(s))] #状态定义,从某个端到某个端是否回文
        longest = 1                                                 #最长度初值为1
        res = s[0]                                                  #其回文初值为第一个元素
        for r in range(1,len(s)):                                   #右下标从1到最后遍历
            for l in range(r):                                      #左下标从0到右下标遍历
                if s[l]==s[r] and ((r-l)<=2 or dp[l+1][r-1]):       #如果两端相等,并且下标差值小于等于2或者前一个字符串也是回文
                    dp[l][r] = True                                 #就定义当前的字符串也是回文
                    cur_len = r-l+1                                 #此时的最大长度为r-l+1
                    if cur_len > longest:                           #如果当前的长度大于最大长度
                        longest = cur_len                           #将当前的长度进行缓存
                        res = s[l:r+1]                              #缓存当前的结果
        return longest,res

if __name__ == '__main__':
    solution = Solution()
    s = 'abaabcdcba'                                               #回文是abcdcba,长度为7
    longest,res = solution.longestPalindrome(s)
    print('最长为:',longest,',其子串为:',res)

 

posted @ 2019-09-10 17:30  weilongyitian  阅读(370)  评论(0编辑  收藏  举报