【数据结构笔记】Leetcode 5. 最长回文子串(动态规划)

思路参考:https://leetcode.com/problems/longest-palindromic-substring/discuss/2925/Python-O(n2)-method-with-some-optimization-88ms.

题目:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
示例 1:

输入: "babad"
输出: "bab"
注意: "aba"也是一个有效答案。

示例 2:

输入: "cbbd"
输出: "bb"

思路:
假设一个字符串已经有最长回文字串,且长度P,则在字符串末尾增加一个字符,则回文串的长度变化只有三种情况为0,1,2;
0代表新添加一个字符,则最长的回文串仍是原最长回文串;
1代表回文串的长度增加1,新的长度为Q=P+1,此时只有一种情况,即原最长回文字串为相同字符例如‘aaa’到‘aaaa’,回文串长度增加1;
2代表回文串的长度增加2,新的长度为Q=P+2,例如‘baa’,回文字串为‘aa’,末尾添加‘b’,则‘baab’,最长回文串为‘baab’,长度增加2;
证明:假设原maxPalindromeLen长度为P,增加1个字符,maxPalindromeLen增加3或者更多,则Q>=P+3;则,当去掉这个字符时,原字符串最后一个字符一定是原maxPalindromeLen中的字符,原maxPalindromeLen至少为Q-2;但是Q-2>P,所以不存在这种情况。
那就很简单了,每次只需增加一个字符,从头到尾遍历,判断是否是回文串,是的话长度增加1或者2,同时更新最长回文字串。
PYTHON:

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """

        if s==s[::-1]: 
            return s       

        maxLen=1
        start=0
        for i in xrange(len(s)):
            if i-maxLen >=1 and s[i-maxLen-1:i+1]==s[i-maxLen-1:i+1][::-1]:
                start=i-maxLen-1
                maxLen+=2
                continue

            if i-maxLen >=0 and s[i-maxLen:i+1]==s[i-maxLen:i+1][::-1]:
                start=i-maxLen
                maxLen+=1
        return s[start:start+maxLen]

猜你喜欢

转载自blog.csdn.net/m0_37477175/article/details/80277815
今日推荐