1.题目
2.题目意思
找出回文串,注意bad不是回文串,bab才是。
特殊情况就是空字符串返回空,单个字符串返回单个,无回文串返回第一个字母。
3.代码
解法1:
class Solution:
def longestPalindrome(self, s: str) -> str:
m = len(s)
if m == 0:
return ''
maxS = s[0]
for i in range(m):
for j in range(i+1, m+1): # 请细品
strr = s[i:j]
strr1 = strr[::-1]
if strr == strr1 and len(strr)>len(maxS):
maxS = strr
return maxS
思路:暴力
运气好就能过,运气不好就tle。代码是没什么问题,注意j
的取值是range(i+1, m+1)
,可以细细想想为什么~
解法2:
class Solution:
def longestPalindrome(self, s: str) -> str:
m = len(s)
if m < 2:
return s
res = [[False for _ in range(m)] for _ in range(m)]
le, re ,maxLen = 0, 0, 0
for i in range(m):
for j in range(i+1): # j<=i
if s[i] == s[j] and (i-j < 2 or res[j+1][i-1]):
res[j][i] = True
if maxLen < i -j + 1:
maxLen = i-j+1
le, re = j, i
return s[le:re+1]
思路:dp
初始化记录好回文串的左右索引和长度。
dp递推公式是,当回文串长度小于2时,一定是回文串;当长度大于2时,如果s[i]==s[j]
且s[i+1, j-1]
是回文串时,s[i, j]
是回文串。
循环的j
取range(i+1)
是为了保证j<=i
。另外,循环时往回搜索是因为之前的状态时清楚的,如果往后搜索,状态是不清楚的。
解法3
class Solution:
def longestPalindrome(self, s: str) -> str:
m = len(s)
if m < 2:
return s
def center(left, right):
L, R = left, right
while L >= 0 and R <len(s) and s[L] == s[R]:
L -= 1
R += 1
return R - L - 1
left, right = 0, 0
for i in range(len(s)):
len1 = center(i, i) # 奇数
len2 = center(i, i+1) # 偶数
max_len = max(len1, len2)
if max_len > right - left:
left = i - (max_len - 1)//2
right = i + max_len//2
return s[left:right+1]
思路:中心法
找出最长回文串的中心。中心可能是一个词如dad也可能是两个词如daad,因此两个都试一遍然后取最长,如果确实存在,则更新。
冲冲冲~