今天是紀錄LeetCode解題的第五天
第五題題目:Given a string s, return the longest palindromic substring in s.
給定一個字串s,返回字串中最長的迴文子字串
這題有非常多的解法,可以很直覺的用暴力解法列舉所有結果,也可以用中心擴展法、動態規劃,這兩種時間複雜度都是O(n²),最好的方法是Manacher’s Algorithm,是目前最優解的演算法,但也比較複雜,今天著重介紹中心擴展法,比較簡單易懂
概念
class Solution:
def longestPalindrome(self, s: str) -> str:
start = 0
max_len = 0
for center in range(len(s)):
#找奇數迴文
left = center
right = center
start,max_len = find(s,left,right,start,max_len)
#找偶數迴文
left = center
right = center + 1
start,max_len = find(s,left,right,start,max_len)
return s[start:start+max_len]
def find(s,left,right,start,max_len):
while left >= 0 and right < len(s) and s[left] == s[right]: #判斷left,right在範圍內也就是s的長度內,並且左邊字元等於右邊字元
if right - left + 1 > max_len: #如果目前找到的迴文子字串大於最大迴文子字串
max_len = right - left + 1 #更新長度
start = left
left -= 1 #往左擴展
right += 1 #往右擴展
return start,max_len
初始狀態
s = "babab"
start = 0
max_len = 0
第一次執行(center = 0,字元'b')
1.奇數迴文(left = 0, right = 0)
2.偶數迴文(left = 0, right = 1)
第二次執行(center = 1,字元'a')
1.奇數迴文(left = 1, right = 1)
2.偶數迴文(left = 1, right = 2)
第三次執行(center = 2,字元'b')
1.奇數迴文(left = 2, right = 2)
2.偶數迴文(left = 2, right = 3)
第四次執行(center = 3,字元'a')
1.奇數迴文(left = 3, right = 3)
2.偶數迴文(left = 3, right = 4)
第五次執行(center = 4,字元'd')
1.奇數迴文(left = 4, right = 4)
2.偶數迴文(left = 4, right = 5)
最後回傳"bab"