동적 프로그래밍에 첫 번째 버전
- 상기 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 재현