【leetcode】5 最长回文子串

题目

在这里插入图片描述

分析

以baacac为例,构造dp[j][i],表示从j到i子串是否为回文序列。因为i==j时是单个字符,一定是回文串,所以dp[j][i]的对角线一定是True。
当s[j]!=s[i]时,当前子串s[j:i]一定不是回文串。比如s[0:3]
当s[j]==s[i]时,如果s[j:i]长度为2,一定是回文串比如s[1:2]
当s[j]==s[i]且子串长度大于2,则依据s[j+1:i-1]判断s[j:i]是不是回文串。比如s[3:5]或者s[2:4]。

012345
TFFFFF
FTTFFF
FFTFTF
FFFTFT
FFFFTF
FFFFFT

Python代码

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        if not s: return ""
        if len(s)<=1: return s
        max_len = 1
        begin = 0
        dp= [[False]*len(s) for i in range(len(s))]

        for i in range(len(s)):
            dp[i][i] = True
        
        for i in range(1,len(s)):# 列
            for j in range(0,i):# 行
                if s[i]!=s[j]:
                    dp[j][i] = False
                else:
                    if i-j+1<3:
                        dp[j][i] = True
                    else:
                        dp[j][i] = dp[j+1][i-1]
                if dp[j][i]:
                    if i-j+1>max_len:
                        begin = j
                        max_len = i-j+1
        
        return s[begin:begin+max_len]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值