5. 긴 회문 하위 문자열 [중간] 긴 회문

동적 프로그래밍에 첫 번째 버전

  • 상기 n * n 개의 DP, DP [J] 주제 인 [I] I 내지 J는 회문 아니다
  • DP [j]가 [I] DP 사용되는 바와 같이, N은 0 내지 J, I 0 내지 J, J 이유 N [J는 1 + [I-1, J + 1은 이송되지 않도록
  • DP [J]를 업데이트 할 수 있습니다 [j는 달리 잘못 갈 것입니다, 진정한 =
  • 상태 전이 식 : S [I] == S [J]과 (지 <= 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