leetcode : Longest Palindromic Substring
runtime 13 ms, beats 94.30% of cpp submissions
O(n^2) solution with explanation
tags: palindrome
🔗 link
🧷 extended
📖 description
給定一個字串 s ,找出最長的回文子字串
ex. babad -> bab , aba 都是最長的回文子字串
🧠 solution
本題可以藉由 Manacher’s Algorithm (馬拉車演算法) 來進一步降低時間複雜度到 O(n) ,但目前仍在理解中。
最基礎的想法是找出所有的子字串,並一一測試他是否回文,但找出所有子字串的時間複雜度為 O(n^3) ,而其實在這個部分可以利用回文字串的特性做出化簡,使用中心擴散的方法來降低時間複雜度。
以 s = baabad 為例,可以挑每個字元當作擴散的起點,來找到符合的子字串
此時會有兩種狀況
- 要找的回文子字串是奇數的,比如以 baabad 的第2個 b 作為中心找到 aba
- 要找的回文子字串是偶數的,比如以 baabad 的第1個與第2個 a 作為中心找到 baab
當跑過所有的 index 時就會找到最長的回文子字串了
⏳ time complexity
遍歷字串 O(n) ,最糟狀況下每次擴散都會走到某一邊的結尾 O(n) (每次都會走到最小段的結尾)
總時間複雜度 O(n^2)
📝 code
1 | class Solution { |