LeetCode第四题:最长回文子串python

本文探讨了三种求解最长回文子串的算法:遍历搜索、改进版中心扩展法及动态规划。通过实例解释每种方法的原理,对比其效率,并提供了Python代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
在这里插入图片描述
什么是回文串>>>正着读反着读都一样的字符串。
做题前知识点补充:
from: https://www.cnblogs.com/ForXinYuanStudyPy/p/7625830.html
在这里插入图片描述
截图来自上面链接,其中我们方法一只需要用到红框内容。

本题我打算用两种方法来做,一种是比较低级的遍历搜索,一种是动态规划。但是穿插了一种从别的地方看到的方法,很容易理解,所以放上去了。

方法一:

class Solution:
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        maxlen = 0
        answer =''
        for i in range(len(s)):
            for j in range(i,len(s)):
                temp = s[i:j+1]
                if temp==temp[::-1] and len(temp)>maxlen:
                    maxlen = len(temp)
                    answer = temp
        return answer

是一次ac的没问题,但是很慢。超过了3.11%的提交用户。。。
稍微讲一下:从字符串从左到右开始遍历,对于遍历到的每一个i,j就从当前i开始一直到最后一个字符,

方法2:

来自:https://blog.csdn.net/u012560212/article/details/71708982

class Solution(object):
    def longestPalindrome(self, s):
        res = ""
        for i in xrange(len(s)):            
            tmp = self.helper(s,i,i)
            #odd case like aba
            if(len(tmp)>len(res)):
                res = tmp
                
            tmp = self.helper(s,i,i+1)
            #even case like abba
            if(len(tmp)>len(res)):
                res = tmp
        return res
            
    # get the longest palindrome, l, r are the middle indexes   
    # from inner to outer            
    def helper(self,s,l,r):
        while l>=0 and r<len(s) and s[l]==s[r]:
            l -=1
            r +=1
        return s[l+1:r]

方法3动态规划

class Solution:
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        maxlen = 0
        answer = ''
        matrix = [[0 for k in range(len(s))] for k in range(len(s))]
        for j in range(len(s)):
            for i in range(0,j+1):
                if j-i<=1:
                    if s[i]==s[j]:
                        matrix[i][j] = 1
                        if j-i+1>maxlen:
                            maxlen = j-i+1
                            answer = s[i:j+1]
                elif j-i>1:
                    if s[i]==s[j] and matrix[i+1][j-1]:
                        matrix[i][j] = 1
                        if j-i+1>maxlen :
                            maxlen = j-i+1
                            answer = s[i:j+1]
        return answer

在这里插入图片描述
https://blog.csdn.net/bailang_zhizun/article/details/80538774
细节请参考上面链接
在这里插入图片描述
进阶的dp请参看上面链接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值