描述:給一個字符串s,查找它的最長的迴文子串。s的長度不超過1000。spa
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer. 我是採用動態規劃解決此題的。官方的solutions中提供了幾種思路,包括我使用的DP。這裏摘要以下:思路1: 將s反轉獲得s',而後查找s和s'的最長公共子串substring,那麼substring就是最長迴文子串。好比:s = "caba", s' = "abac" => substring = "aba"可是存在特殊的狀況如: s = "abacdfgdcaba", s' = "abacdgfdcaba" => substring = "abacd" 能夠看到substring並非迴文,這是由於s中存在子串s1和s2,而reverse(s1)=s2,可是s1自己並非迴文。 對這種狀況,能夠對比Index,檢測反轉後的substring是否是由反轉前的substring得來。 至於查找s1和s2的最長公共子串,更優秀的方法能夠參見:https://en.wikipedia.org/wiki/Longest_common_substring_problem思路2: 直接暴力檢索全部字符串是否迴文,略過。思路3(DP): 定義P(i,j)表示在s中索引i~j的字串是否爲迴文。則有: P(i,j) = (P(i+1,j-1) and s[i] == s[j]),即當且僅當字符s[i] == s[j]且子串s(i+1,j-1)是迴文時,s(i,j)是迴文; 基礎情形: P(i,i) = true P(i,i+1) = s[i] == s[i+1]思路4: 任何一個迴文子串都是由一個分隔點不斷向兩側擴展相同字符得來的,所以只須要以每一個字符或字符間隔點起始向兩側儘量擴展,篩選最長的子串便可。此思路看起來彷佛不怎麼樣,可是其時間複雜度也只有O(n的平方),而空間複雜度只有O(1)。思路5: 詳細見:https://articles.leetcode.com/longest-palindromic-substring-part-ii/