动态规划之最长回文子串

5. 最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:

输入:s = "cbbd"
输出:"bb"
 
提示:

1 <= s.length <= 1000
s 仅由数字和英文字母组成

题解:

解题思路:中心拓展法,从当前字符向两端进行拓展(两个指针背向移动),每个位置都判断下,以该位置为中心的回文串最长为多少,遍历一遍,保留最长的那个

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

        for i in range(len(s)):
            odd = self.is_palindrom(s, i, i)    # 回文串元素个数为奇数
            even = self.is_palindrom(s, i, i + 1)   # 回文串元素个数为偶数
            long_sub = odd if len(odd) > len(long_sub) else long_sub
            long_sub = even if len(even) > len(long_sub) else long_sub

        return long_sub

    def is_palindrom(self, s, l, r):
        """不超出边界且扩散的两边的元素相等,返回回文子串"""
        while l >= 0 and r < len(s) and s[l] == s[r]:
            l -= 1
            r += 1

        return s[l + 1: r]

模拟:

s = 'babad'  n = len(s) = 5
i = 0  
	奇数:l = 0, r = 0 ==> s[l] == s[r] ==> l = -1, r = 1  ===> s[0: 1] ==> long_sub = "b"
    偶数: l = 0, r = 1 ==> s[l] != s[r] ===> s[0: 1] ==> long_sub = "b"
        
i = 1
	奇数:l = 1, r = 1 ==> s[l] == s[r] ==> l = 0, r = 2  ===> l = -1, r = 3  ===> s[0: 3] ==> long_sub = "bab"
    偶数: l = 1, r = 2 ==> s[l] != s[r] ===> s[2: 2] ==> long_sub = "bab"
        
....

参考:【山鬼】左右指针——从中心往外扩散

你可能感兴趣的:(算法刷题,动态规划,算法)