4.10leetcode剑指 Offer 14- I. 剪绳子5. 最长回文子串

剑指 Offer 14- I. 剪绳子

 

class Solution:
    def cuttingRope(self, n: int) -> int:
        dp = [[0]*(n+1) for i in range(n+1)]
        for i in range(1,n+1):
            dp[i][1] = i
        for i in range(2,n+1):
            for j in range(2,i+1):
                lmax = 0
                for k in range(j-1,i):
                    if dp[k][j-1]*(i-k)>lmax:lmax=dp[k][j-1]*(i-k)
                dp[i][j]=lmax
        return max(dp[n][2:])

5. 最长回文子串 

观察可得如果s[i]结束的最长回文串比s[i-1]长,只能是延长s[i-1]的串,否则只能另成一条新串,寻找这条新串的方法是,遍历s[i-1]起点及其后面的节点寻找新回文串。

 

 

class Solution:
    def longestPalindrome(self, s: str) -> str:
        dp = [0]*len(s)
        be = [0]*len(s)
        dp[0],be[0]=s[0],0
        def huiwen(s):
            cur1,cur2 = 0,len(s)-1
            while cur1<cur2:
                if s[cur1]!=s[cur2]:return False
                cur1+=1
                cur2-=1
            return True
        def f(s,cur):
            if be[cur-1]-1>=0 and s[cur]==s[be[cur-1]-1]:#cbabc
                dp[cur] = s[be[cur-1]-1]+dp[cur-1]+s[cur]
                be[cur] = be[cur-1]-1
            else:
                for j in range(be[cur-1],cur+1):
                    if huiwen(s[j:cur+1]):
                        dp[cur]=s[j:cur+1]
                        be[cur]=j
                        break
        for i in range(1,len(s)):
            f(s,i)
        maxl = dp[0]
        print(dp)
        for i in dp:
            if len(i)>len(maxl):maxl=i
        return maxl

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值