LeetCode005最长回文子串之动态规划

题目描述:

给你一个字符串 s,找到 s 中最长的回文子串。

【题目来源:力扣(LeetCode)】 

解法:动态规划

维基百科:动态规划(英语:Dynamic programming,简称 DP),是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。

以该题为例:首先,从示例中可看出该题可能是不唯一解,我们需要从所给的字符串s中,找到满足符合条件的子字符串。简单的说,我们需要遍历字符串s的任意长度的子字符串,再通过条件判断,返回最长的子字符串。

判断过程:

我们通过字符串s对长度建立一个正二维表,使用两个指针,一个指针i从索引1的位置开始锁定,另一个指针j从索引0的位置到一直遍历到第一个指针的位置。令 dp[i][j] 表示 S[i] 至 S[j] 所表示的子串是否是回文子串,是则为 True,不是则为False。这样根据 S[i] 是否等于 S[j] ,可以把转移情况分为两类:

 1.若 S[i] == S[j],那么只要 S[i+1] 至 S[j-1] 是回文子串,S[i] 至 S[j] 就是回文子串;如果S[i+1] 至 S[j-1] 不是回文子串,则 S[i] 至 S[j] 也不是回文子串。

 2.若 S[i] != S[j],那么 S[i] 至 S[j] 一定不是回文子串。

依次进行对比:

源代码:

class Solution:
    def longestPalindrome(self, s: str) -> str:
        if not s :
            return ""
        length = len(s)
        dp = [[False for _ in range(length)] for _ in range(length)]
        for i in range(length):
            dp[i][i] = True
        
        c_index = 0
        max_index = 1

        for j in range(1,length):
            for i in range(j):
                if s[i] == s[j]:
                    if j - i < 3:
                        dp[i][j] = True
                    else:
                        dp[i][j] = dp[i+1][j-1]
                if dp[i][j]:
                    now_index = j - i + 1
                    if now_index > max_index:
                        max_index = now_index
                        c_index = i
        return s[c_index:(max_index + c_index)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Algorithm-007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值