【力扣5.最长回文子串】多种解法:动态规划+中心扩散(golang)

题目描述

https://leetcode-cn.com/problems/longest-palindromic-substring/

思路题解

https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zui-chang-hui-wen-zi-chuan-by-leetcode-solution/的方法一、二

动态规划法

带剪枝自敲代码:

func longestPalindrome(s string) string {
    var n=len(s)
    var p [1000][1000]int
    //0则是回文串,1则不是回文串,d是间隔
    for d:=1;d<n;d++{
        i:=0
        if i+d>=n{
            continue
        }
        if d==1{
            for i+d<n{
                j:=i+d
                if !(s[i]==s[j]){
                    p[i][j]=1
                }
                i++
            }
        }else{
            for i+d<n{
                j:=i+d
                if !(p[i+1][j-1]==0 && s[i]==s[j]){
                    p[i][j]=1
                }
                i++
            }
        }
         
    }
    for d:=n-1;d>=0;d--{
        i:=0
        if i+d>=n{
            continue
        }
        for i+d<n{
            j:=i+d
            if p[i][j]==0{
                return s[i:j+1]
            }
            i++
        }
    }
    return ""
}

在这里插入图片描述

不带剪枝代码:

func longestPalindrome(s string) string {
    var n=len(s)
    ans := ""
    p := make([][]int, n)
    for i := 0; i < n; i++ {
        p[i] = make([]int, n)
    }
    //1则是回文串,0则不是回文串,d是间隔
    for d:=0;d<n;d++{
        for i:=0;i+d<n;i++{
            j:=i+d
            if d==0{
                p[i][j]=1
            }else if d==1{
                if s[i]==s[j]{
                    p[i][j]=1
                }
            }else{
                if s[i]==s[j]{
                    p[i][j]=p[i+1][j-1]
                }
            }
            if p[i][j]==1 && d+1>len(ans){
                ans=s[i:j+1]
            }
        }
    }
    return ans
}

在这里插入图片描述

中心扩散法

func longestPalindrome(s string) string {
    if s == "" {
        return ""
    }
    start, end := 0, 0
    for i := 0; i < len(s); i++ {
        left1, right1 := expandAroundCenter(s, i, i)
        left2, right2 := expandAroundCenter(s, i, i + 1)
        if right1 - left1 > end - start {
            start, end = left1, right1
        }
        if right2 - left2 > end - start {
            start, end = left2, right2
        }
    }
    return s[start:end+1]
}

func expandAroundCenter(s string, left, right int) (int, int) {
    for ; left >= 0 && right < len(s) && s[left] == s[right]; left, right = left-1 , right+1 { }
    return left + 1, right - 1
}


在这里插入图片描述

class Solution:
    def longestPalindrome(self, s: str) -> str:
        def judge(l,r):
            while l>=0 and r<n and s[l]==s[r]:
                l-=1
                r+=1
            return l+1,r-1
        n=len(s)
        l,r=0,0
        for i in range(n):
            l1,r1=judge(i,i)
            l2,r2=judge(i,i+1)
            if r-l<=r1-l1:
                l,r=l1,r1
            if r-l<=r2-l2:
                l,r=l2,r2
        return s[l:r+1]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值