[leetcode][algorithm][python]Longest Palindromic Substring【未完!】

本文深入探讨了寻找字符串中最长回文子串的多种算法,包括暴力法、动态规划、从中心扩展的方法以及Manacher's Algorithm。通过具体代码示例,详细解释了每种方法的工作原理和复杂度分析。

最长回文子串

方法一:将字符串逆序,找原字符串和逆序字符串的最长公共子串

漏洞:可能源字符串中存在对称的子串

解决:检查索引值

方法二:暴力

方法三:动态规划

先从一两个字母的回文开始,向两边增加对称字母

方法四:从串中心延伸 java代码:

public String longestPalindrome(String s) {
    if (s == null || s.length() < 1) return "";
    int start = 0, end = 0;
    for (int i = 0; i < s.length(); i++) {
        int len1 = expandAroundCenter(s, i, i);//中间字母是一个
        int len2 = expandAroundCenter(s, i, i + 1);//中间字母是两个一样的
        int len = Math.max(len1, len2);
        if (len > end - start) {
            start = i - (len - 1) / 2;
            end = i + len / 2;
        }
    }
    return s.substring(start, end + 1);
}

private int expandAroundCenter(String s, int left, int right) {
    int L = left, R = right;
    while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) {
        L--;
        R++;
    }
    return R - L - 1;
}

Complexity Analysis

  • Time complexity : O(n^2). Since expanding a palindrome around its center could take O(n) time, the overall complexity is O(n^2).

  • Space complexity : O(1).

python代码:

class Solution:
    
    def longestPalindrome(self, s: 'str') -> 'str':
        start=end=0
        length=len(s)
        for i in range(length):
            len1=self.expandAroundCenter(s,i,i)
            len2=self.expandAroundCenter(s,i,i+1)
            maxlen=max(len1,len2)#不要把名字起成len
            if maxlen>end-start:
                start=i-(maxlen-1)//2
                end=i+maxlen//2
        #print(s[start:end+1])
        return s[start:end+1]#注意不是s[start,end+1]
            
        
    def expandAroundCenter(self, s:'str', left:'int', right:'int')->'int':
        L=left
        R=right
        while L>=0 and R<len(s) and s[L]==s[R]:
            L-=1
            R+=1
        return R-L-1

solu=Solution()
print(solu.longestPalindrome('abcbe'))

方法五:Manacher's Algorithm(难)

O(n)效率

介绍该算法的链接:

https://cp-algorithms.com/string/manacher.html

以后再详细看咯

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值