5.最長回文サブストリング[中]最長パリンドローム

動的計画への最初のバージョン

  • n個×n個のDP、DPはあるjへ[J]の[i]を、私は回文ではありません
  • DP [J]として0からnまでのJ、I 0からjへ、なぜnはjは、[i]は、J + 1が横断していない、DP [J + 1] [I-1]を使用します
  • DP [J] [J]がTrue =更新することに注意してください、それ以外の場合は間違って行くだろう
  • 状態遷移式:S [I] == S [J]と(JI <= 1又はDP [I + 1] [J-1])
class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        if len(s) <= 1:
            return s
        dp = [[False for i in range(len(s))] for j in range(len(s))]
        maxlen = start = end = 0
        for j in range(len(s)):
            dp[j][j] = True
            for i in range(j):
                if s[i] == s[j] and (j-i<=1 or dp[i+1][j-1]):
                    dp[i][j] = True
                    if j - i + 1 > maxlen:
                        start = i
                        end = j 
                        maxlen = j - i + 1
        return s[start:end+1]

両側の真ん中からの拡散

  • そのため、同じ奇数と偶数ではない、それは分離されなければなりません。
  • 更新が左と右のことに注意してください
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        if len(s) <= 1:
            return s
        maxlen = l = r = 0
        for i in range(len(s)):
            for j in range(2):
                left = i
                right = left + j
                while left >= 0 and right < len(s) and s[left] == s[right]:
                    left -= 1
                    right += 1
                left += 1
                right -= 1
                if right - left + 1 > maxlen:
                    l = left
                    r = right
                    maxlen = right - left + 1
        return s[l:r+1]

ます。https://www.jianshu.com/p/5cd22f39c067で再現

おすすめ

転載: blog.csdn.net/weixin_34409703/article/details/91066229