Leetcode_5最长回文字符子串问题的四种解法

1.暴力解法:

从第一个字符开始依次遍历。从第i位置的字符开始,然后从长到短依次比对该字符串是否为回文字符串

class Solution:
    def longestPalindrome(self, s: str) -> str:
        m = ''  # Memory to remember a palindrome
        for i in range(len(s)):  # i = start, O = n
            for j in range(len(s), i, -1):  # j = end, O = n^2
                if len(m) >= j-i:  # To reduce time
                    break
                elif s[i:j] == s[i:j][::-1]:
                    m = s[i:j]
                    break
        return m

 

2.动态规划法

 字符串“mabcban”中"bcb"为回文字符串,则当只需判断左边的b左边的字符和右边的b右边的字符是否相同即可。

class Solution:
    def longestPalindrome(self, s: str) -> str:
        dp = [[0] * len(s) for i in range(len(s))]#生成10*10的矩阵,用于记录
        ans = ""
        max_length = 0
        for i in range(len(s) - 1, -1, -1):
            '''从后往前'''
            for j in range(i, len(s)):
                '''若两个字符相同且相邻的字符也相同,则记为1'''
                if s[i] == s[j] and (j - i < 2 or dp[i+1][j-1] == 1):
                    dp[i][j] = 1 #如果两个位置的字符相同,则在矩阵中记为1
                    if ans == "" or max_length < j - i + 1:
                        ans = s[i:j+1]
                        max_length = j - i + 1   
        return ans

 

3.在中心周围展开

每一个回文字符串必有一个中心字符,从中心字符开始向两边延伸比对。然后返回最长的字符。

class Solution:
    def longestPalindrome(self, s: str) -> str:
        if s == "":
            return ""
        end = 0 ;start = 0
        for i in range(len(s)):
            common = s[i]
            left = i-1 ;right = i+1
            while (left >= 0) and (right < len(s)) and (s[left] == s[right]):
                left -= 1
                right += 1
            len1 = right - left - 1
        
            left = i ;right = i+1
            while (left >= 0) and (right < len(s)) and (s[left] == s[right]):
                left -= 1
                right += 1
            len2 = right - left - 1
            
            lenall = max(len1,len2)
            if lenall > end - start :
                start = i - int((lenall-1)/2)
                end = i + int(lenall/2)
        return s[start:end+1]

 

4.Manacher 算法

一个非平凡的算法,很难短时间内想出来。

https://leetcode.com/problems/longest-palindromic-substring/discuss/3337/Manacher-algorithm-in-Python-O(n)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值