描述:给一个字符串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/