算法:最长回文子串(python题解,3种解法)

题目:最长回文子串

难度:中等

一、描述

算法:最长回文子串(python题解,3种解法)_第1张图片

二、题解:

2.1 暴力法(O(N^3))

解释:

循环三次。第一次起始点循环;第二次终止点循环(从最右边开始到起始点为止);第三次起始点开始终止点结束,当两个值不相等时候跳出循环。只有完整进行第三次循环才满足回文串的条件。

class Solution:
    def longestPalindrome(self, s: str) -> str:
        max_ = 1
        max_str = s[0]
        length = len(s)
        for i in range(length):
            for j in range(length-1,i,-1):
                k_l = i
                k_r = j
                while(s[k_l] == s[k_r]):
                    if (k_l >= k_r):
                        break
                    else:
                        k_l+=1
                        k_r-=1
                if k_l>=k_r and j - i +1 > max_:
                    max_ = j - i +1
                    max_str = s[i:j+1]
                    break
            if max_ == length:
                break
        return max_str  

2.2 动态规划(O(N^2))

解释:

首先初始化一个维度为length的二维单位阵(对角全为1,其余为0);判断是否有长度为2的回文串,如有则起始和终止索引在矩阵中对应的位置为1。
递归的思路为当起始点i到终止点j为回文串,则起始点i+1到终止点j-1也是回文串。因此从长度为3开始进行判断,当发现回文串时,修改矩阵对应位置值为1,并进行长度和起始位置的记录。

class Solution:
    def longestPalindrome(self, s: str) -> str:
        length= len(s)
        max_ = 1
        max_start = 0
        ## initial matrix
        dst = [[0 for i in range(length)] for _ in range(length)]
        for i in reversed(range(length)):
            dst[i][i]=1
            if(i+1<length and s[i]==s[i+1]):
                dst[i][i+1]=1
                max_ = 2
                max_start=i
        for le in range(3,length+1):
            for i in range(0,length-le+1): 
                if(s[i]==s[i+le-1] and dst[i+1][i+le-2]==1):
                    dst[i][i+le-1] = 1
                    if le > max_:
                        max_ = le 
                        max_start = i
        return s[max_start:max_start+max_]             

2.3 中心扩展(O(N^2))

解释:

从中心向外扩展。
分为两种情况:第一种当回文串长度为奇数的情况;第二种当回文串长度为偶数的情况。
左右同时向外扩展,当左右不相同时停止扩展,记录最长回文串长度及起始位置。

class Solution:
    def longestPalindrome(self, s: str) -> str:
        max_ = 1
        max_start = 0
        length = len(s)
        for i in range(length): # odd
            for k in range(2):
                k_l = i-k # 0 代表偶数,1代表奇数 
                k_r = i+1
                while(k_l>=0 and k_r<length and s[k_l]==s[k_r]):
                    k_l -= 1
                    k_r += 1
                if max_ < k_r - k_l-1:
                    max_ = k_r - k_l-1
                    max_start = k_l+1
        return s[max_start:max_start+max_]               

如有问题或建议欢迎私信。
严禁私自转载,侵权必究

参考:
[1] 最长回文子串 [CSDN]

你可能感兴趣的:(算法,算法,字符串,回文串,leetcode)