leetcode5-最长回文子串(动态规划)

题目描述:

在这里插入图片描述

暴力解法:

先分享自己的暴力法思路:
定义两个指针(i,j),j = i + len - 1,其中这个len指的是子串的长度,从最大长度依次-1。每确定一个len,i从0开始向右移,对应的j也确定下来。一旦碰到这样的子串是回文,就直接输出。

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        lenth = len(s)
        if lenth == 0:
            return s
        for i in range(lenth,-1,-1):
            start = 0
            end = start + i
            while end <= lenth:
                if s[start:end] == s[start:end][::-1]:
                    return s[start:end]
                start += 1
                end += 1

这样的算法复杂度是O(N^3),for那个循环、while循环、判断回文,各都需要O(N)的时间。

动态规划:

即填表法。主要思考的就是状态是什么?以及状态如何转移的问题。这两想到用dp这个数组,dp[i][j]=True\False,分别代表s[I…j]子串是\不是回文子串。
状态有了,表也建了,如何转移?
如果s[i] = s[j],那么s[i…j]是否是回文,取决于s[I+1…j-1];如果s[I]!=s[j],那么s[i…j]一定不是回文,这样,状态转移也确定了,即:

if s[i] == s[j]:
    dp[i][j] = dp[i+1][j-1]
else:
    dp[i][j] = False

这里还有一个问题,就是dp[i+1][j-1]的访问会越界,如果把越界的情况考虑了,那就解出来了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值