力扣的最长回文子串解法(Python3)

力扣的最长回文子串解法

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

示例 1:

输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:

输入: “cbbd”
输出: “bb”

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

参考程序1:

class Solution:
    def longestPalindrome(self, s: str) -> str:
        temp = temp1 = 0
        for i in range(len(s)):
            len1 = self.centerexpand(s, i, i)   
            len2 = self.centerexpand(s, i, i+1)  
            max_len = max(len1, len2)
            if max_len > temp1 - temp + 1:
                temp = i - (max_len - 1)//2
                temp1 = i + max_len//2
        return s[temp: temp1+1]
                
    def centerexpand(self,s,h,result):
        while h >= 0 and result < len(s) and s[h] == s[result]:
            h -= 1
            result += 1
        return result - h - 1

运行结果1:
在这里插入图片描述
参考程序2:

class Solution:
    def longestPalindrome(self, s: str) -> str:
        temp=1
        templ=0;
        tempr=0
        for i in range(len(s)):
            l=i-1
            r=i+1
            result=1
            while(l>=0 and r<len(s) and s[l]==s[r]):
                result+=2
                l-=1
                r+=1
            if temp<result:
                temp=result
                templ=l+1
                tempr=r-1
            if i+1<len(s) and s[i]==s[i+1]:
                l=i-1
                r=i+2
                result=2
                while(l>=0 and r<len(s) and s[l]==s[r]):
                    result+=2
                    l-=1
                    r+=1
            if temp<result:
                temp=result
                templ=l+1
                tempr=r-1
        return s[templ:tempr+1]


运行结果2:
在这里插入图片描述
参考程序3:

class Solution:
    def longestPalindrome(self, s: str) -> str:
        if s == None:
            return None
        length = len(s)
        if length <= 1:
            return s
        dp = [[0 for i in range(length)] for i in range(length)]
        result = s[0]
        temp = 1
        for i in range(0,length):
            for j in range(0,i+1):
                if i-j<=1:
                    if s[j]==s[i]:
                        dp[j][i]=1
                        if temp < i-j+1:
                            result  = s[j:i+1]
                            temp = i-j+1
                else:
                    if s[j]==s[i] and dp[j+1][i-1]:
                        dp[j][i]=1
                        if temp < i-j+1:
                            result  = s[j:i+1]
                            temp = i-j+1
        return result 

运行结果3:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值