動的計画への最初のバージョン
- 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で再現