class Solution:
def longestPalindrome(self, s: str) -> str:
substrings = []
# i 不用走到最後,因為走到最後的話就等於沒有字元了
for i in range(len(s)-1):
# j 直接從 i 的下一個字元開始看起即可,長度為一個字元不用考慮。
for j in range(i+1, len(s)):
substrings.append(s[i:j+1])
class Solution:
def longestPalindrome(self, s: str) -> str:
substrings = []
for i in range(len(s)-1):
for j in range(i+1, len(s)):
substrings.append(s[i:j+1])
def isPalindrome(substring):
left = 0
right = len(substring) - 1
while left < right:
if substring[left] != substring[right]:
return False
left += 1
right -= 1
return True
ans = s[0]
for substring in substrings:
if isPalindrome(substring):
if len(substring) > len(ans):
ans = substring
return 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]
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
這裡有第二的地方要注意,我沒有把它簡化,那就是最後一個回傳值為什麼是這麼奇怪的 right - left + 1 - 2 減二的原因是因為在 while 迴圈裡面,我們是兩個指針分別向外個走一步後,才發現不是回文的,所以多走了兩部要剪掉。如果還是不好想,可以試著用回文的特性想看看。
奇數的 abc ,傳入 left = 1, right = 1 時,while 迴圈的 if 條件不會觸發,所以指針會向左向右個一步,變成 left = 0, right = 2 ,這時候我們要回傳的回文長度應該是 1 才對,把變數帶入:(2 - 0) + 1 - 2 = 1 正確。
偶數的 abab 傳入 left = 1, right = 2 時,while 迴圈裡的 if 條件會觸發,所以指針不動,依然是left = 1, right = 2 這時候回文的長度應該是 0 ,把變數帶入:(2 - 1) + 1 - 2 = 0 正確。
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]