题目描述:
给你一个字符串 s
,找到 s
中最长的 回文 子串。
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd" 输出:"bb"
提示:
1 <= s.length <= 1000
s
仅由数字和英文字母组成
我的作答:
动态规划。。
class Solution:
def longestPalindrome(self, s: str) -> str:
if not s: return ''
n = len(s)
if n<2: return s
max_len = 1
begin = 0
dp = [[False]*n for _ in range(n)]
for i in range(n):
dp[i][i] = True
for L in range(2, n+1):
for i in range(n):
j = L+i-1
if j>=n: break
if s[i]!=s[j]:
dp[i][j] = False
else:
if j-i<3: dp[i][j] = True
else: dp[i][j] = dp[i+1][j-1]
if dp[i][j] and j-i+1>max_len: #如果子串回文且两头元素相等
max_len = j-i+1
begin = i
return s[begin:begin+max_len]
参考:
class Solution:
def expand(self, s, left, right):
while left >= 0 and right < len(s) and s[left] == s[right]:
left -= 1
right += 1
return (right - left - 2) // 2
def longestPalindrome(self, s: str) -> str:
end, start = -1, 0
s = '#' + '#'.join(list(s)) + '#'
arm_len = []
right = -1
j = -1
for i in range(len(s)):
if right >= i:
i_sym = 2 * j - i
min_arm_len = min(arm_len[i_sym], right - i)
cur_arm_len = self.expand(s, i - min_arm_len, i + min_arm_len)
else:
cur_arm_len = self.expand(s, i, i)
arm_len.append(cur_arm_len)
if i + cur_arm_len > right:
j = i
right = i + cur_arm_len
if 2 * cur_arm_len + 1 > end - start:
start = i - cur_arm_len
end = i + cur_arm_len
return s[start+1:end+1:2]