【Leetcode 5】 最长回文子串

在这里插入图片描述
解法1 动态规划
在这里插入图片描述
在这里插入图片描述

class Solution:
    def longestPalindrome(self, s: str) -> str:


        n=len(s)

        maxstr=""
        dp=[ [False]*n   for _ in range(n)]   注意python创建二维数组的方法
        for l in range(n):
            for i in range(n):
                j=i+l
                if j >=n:
                    break
                if l==0:
                    dp[i][j]=True
                elif l==1:                  #这里不能只加if,如果直接if不用elif
                    dp[i][j]=(s[i]==s[j])
                else:                        #else里的语句也会执行,当遍历到最后一个字母时会索引越界,dp[i+1]就超出了最大索引
                    dp[i][j]=(dp[i+1][j-1] and s[i]==s[j])  
                if dp[i][j] and l+1 >len(maxstr):
                    maxstr=s[i:j+1]
        return maxstr


s1=Solution()
s1.longestPalindrome("ABABA")

在这里插入图片描述

解法2 中心扩展算法
在这里插入图片描述

class Solution {
    public String longestPalindrome(String s) {
         int begin=0,end =0,maxlen=1;

         if (s.length()<1 || s==null) return "";     //获得字符串的长度s.length()  而获得数组的长度    s.length   不加后面的()
         
         for (int i =0 ;i<s.length();i++){
            int oddlen=expandcenter(s,i,i);
            int evenlen=expandcenter(s,i,i+1);
            int curmaxlen=Math.max(oddlen,evenlen);
            /*     第二种方法
            if(curmaxlen>maxlen){
                maxlen=curmaxlen;
                begin=i-(maxlen-1)/2;
            }
            */
            if(curmaxlen>end-begin+1){
                begin=i-(curmaxlen-1)/2;
                end=i+curmaxlen/2;
            }
         }
         //return s.substring(begin,begin+maxlen);   第二种方法
         return s.substring(begin,end+1);
    }


    public int expandcenter(String s,int left,int right){
        while(left>=0 && right<s.length() && s.charAt(left)==s.charAt(right)){
                left--;
                right++;
        }
        //因为退出循环时,right和left指向的字符不包含在里面
        return right-left+1-2;
    }
}

在这里插入图片描述

解法3 Manacher 算法
具体请看参考连接
参考链接https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zui-chang-hui-wen-zi-chuan-by-leetcode-solution/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Bug 挖掘机

支持洋子

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

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

打赏作者

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

抵扣说明:

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

余额充值