给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:输入: "cbbd"
输出: "bb"方法:
1.中心扩散法
2.动态规划,坑啊,a=[[0]*length]*length生成的二维数组是畸形的,如a[i][j]=9,然而全部的j列都成9了,用列表生成式
class Solution(object):
def longestPalindrome(self, s):
if not s:
return ""
length = len(s)
left = 0
right = 0
res = 1
maxlen = 0
maxstart = 0
for i in range(length):
left = i-1
right = i+1
while left>=0 and s[left]==s[i]:
res+=1
left -=1
while right<length and s[right]==s[i]:
res+=1
right+=1
while left>=0 and right<length and s[left]==s[right]:
res+=2
left-=1
right+=1
if res>maxlen:
maxlen = res
maxstart = left
res=1
return s[maxstart+1:maxstart+maxlen+1]
class Solution(object):
def longestPalindrome(self, s):
if not s:
return ""
length = len(s)
maxstart = 0
maxend = 0
maxlen = 1
dp = [[0]*length]*length
for r in range(1,length):
for l in range(r):
if s[l]==s[r] and (r-l<=2 or dp[l+1][r-1]==1):
dp[l][r] = 1
if r-l+1>maxlen:
maxlen = r-l+1
maxstart = l
maxend = r
print(maxstart)
print(maxend)
return s[maxstart:maxend+1]
给定一个字符串s
,找到其中最长的回文子序列。可以假设s
的最大长度为1000
。
示例 1:
输入:"bbbab"输出:4
class Solution(object):
def longestPalindromeSubseq(self, s):
"""
:type s: str
:rtype: int
dp[i] = max(dp[i-1],dp[i]+1)
"""
n = len(s)
if s == s[::-1]:
return n
tmp = [[0 for i in range(n)] for j in range(n)]
for i in range(n):
tmp[i][i] = 1
for j in range(i-1,-1,-1):
if s[i]==s[j]:
tmp[j][i]=2+tmp[j+1][i-1]
else:
tmp[j][i]=max(tmp[j+1][i],tmp[j][i-1])
return tmp[0][n-1]