###### tags: `Leetcode` `medium` `dynamic programming` `python` `Top 100 Liked Questions` # 5. Longest Palindromic Substring ## [題目來源:] https://leetcode.com/problems/longest-palindromic-substring/ ## 題目: Given a string s, return the longest palindromic substring in s. **Example 1:** ``` Input: s = "babad" Output: "bab" Explanation: "aba" is also a valid answer. ``` **Example 2:** ``` Input: s = "cbbd" Output: "bb" ``` ## 解題想法: * 經典DP * **dp[i][j]: s[i]~s[j]是否為迴文** * **由後往前遍歷** * 第一個loop: * 讓i從倒數第二個開始 * for i in range(len(s)-2,-1,-1) * 第二個loop * 讓j跟在i後面 * for j in range(i+1,len(s)) ## python (Sol1: DP): ``` python= class Solution(object): def longestPalindrome(self, s): """ :type s: str :rtype: str """ if len(s)<=1: return s #init dp=[[False]*len(s) for _ in range(len(s))] for i in range(len(s)): dp[i][i]=True #自己一定是true res=s[0] #dp 從尾開始 #dp[i][j] s[i]~s[j]是否為回文 for i in range(len(s)-2,-1,-1): for j in range(i+1,len(s)): if s[i]==s[j]: #若是隔壁or 各往內縮一格=true if (j-i==1 or dp[i+1][j-1]==True): dp[i][j]=True if len(res)< j-i+1: res=s[i:j+1] return res if __name__ == '__main__': result = Solution() s = "afccfb" ans = result.longestPalindrome(s) print(ans) ``` ## python (Sol2: Recursive): * 額外寫個子函式判斷回文處理 * 主程式考量回文屬於奇數or偶數狀況 ``` python= class Solution(object): def longestPalindrome(self, s): """ :type s: str :rtype: str """ if not s: return "" ans = "" for index in range(len(s)): #優化 若剩餘字數量<ans//2 則可以停止ㄌ if len(s)-index<len(ans)//2: break #case: aba cur_find = self.find_max_palindorme(s,index,index) if len(ans)<len(cur_find): ans = cur_find #case:abba cur_find = self.find_max_palindorme(s,index,index+1) if len(ans)<len(cur_find): ans = cur_find return ans #right往右走 left往左走 def find_max_palindorme(self,s,left,right): while right<len(s) and left>=0 and s[right]==s[left]: right +=1 left -=1 #不match才跳出while 要return 上一組正確的 return s[left+1:right] if __name__ == '__main__': result = Solution() s = "afccfb" ans = result.longestPalindrome(s) print(ans) #Input: s = "babad" #Output: "bab" #Explanation: "aba" is also a valid answer. ```