classSolution:deflongestPalindrome(self,s:str)->str: substrings =[]# i 不用走到最後,因為走到最後的話就等於沒有字元了 for i inrange(len(s)-1):# j 直接從 i 的下一個字元開始看起即可,長度為一個字元不用考慮。for j inrange(i+1, len(s)): substrings.append(s[i:j+1])
classSolution:deflongestPalindrome(self,s:str)->str: substrings =[]for i inrange(len(s)-1):for j inrange(i+1, len(s)): substrings.append(s[i:j+1])defisPalindrome(substring): left =0 right =len(substring)-1while left < right:if substring[left]!= substring[right]:returnFalse left +=1 right -=1returnTrue ans = s[0]for substring in substrings:ifisPalindrome(substring):iflen(substring)>len(ans): ans = substringreturn ans
不過其實這道題目我們也不一定要一直更新字串,只要知道索引就好,為什麼 length 是用 j - i + 1 是因為,我們需要的答案是閉區間。
class Solution:
def longestPalindrome(self, s: str) -> str:
def isPalindrome(left, right):
while left < right:
if s[left] != s[right]:
return False
left += 1
right -= 1
return True
start = 0
length = 1
for i in range(len(s)-1):
for j in range(i+1, len(s)):
if isPalindrome(left, right) and j - i + 1 > length:
length = j - i + 1
start = i
return s[start:start+length]
dp[i][j] = s[i] == s[j] and dp[i+1][j-1]
class Solution:
def longestPalindrome(self, s: str) -> str:
n = len(s)
dp = [[False for _ in range(n)] for _ in range(n)]
for i in range(n):
dp[i][i] == True
start = 0
maxLen = 1
for end in range(1, n):
for begin in range(end):
if s[begin] != s[end]:
dp[begin][end] = False
else:
if (end - 1 - (begin + 1) + 1 <= 1):
dp[begin][end] = True
else:
dp[begin][end] = dp[begin+1][end-1]
if dp[begin][end] and end - begin + 1 > maxLen:
maxLen = end-begin + 1
start = begin
return s[start:start+maxLen]
dp[begin][end] = s[begin] == s[end] and (dp[begin+1][end-1] or (end-begin) <= 2))
class Solution:
def longestPalindrome(self, s: str) -> str:
n = len(s)
dp = [[False for _ in range(n)] for _ in range(n)]
for i in range(n):
dp[i][i] == True
start = 0
maxLen = 1
for end in range(1, n):
for begin in range(end):
dp[begin][end] = s[begin] == s[end] and (dp[begin+1][end-1] or (end-begin) <= 2)
if dp[begin][end] and end - begin + 1 > maxLen:
maxLen = end-begin + 1
start = begin
return s[start:start+maxLen]
class Solution:
def longestPalindrome(self, s: str) -> str:
def getPalindromeLen(left, right):
while left >= 0 and right < len(s):
if s[left] != s[right]:
break
left -= 1
right += 1
return right - left + 1 - 2
class Solution:
def longestPalindrome(self, s: str) -> str:
def getPalindromeLen(left, right):
while left >= 0 and right < len(s):
if s[left] != s[right]:
break
left -= 1
right += 1
return right - left + 1 - 2
start = 0
max_length = 1
for i in range(len(s)):
odd = getPalindromeLen(i, i)
even= getPalindromeLen(i, i+1)
curr = max(odd, even)
if curr > max_length:
max_length = curr
start = i - (max_length - 1)//2
return s[start:start+max_length]