LeetCode-5. Longest Palindromic Substring

题目大意:给出一个字符串S,找到一个最长的连续回文串。

首先你要知道回文是什么。回文就是从左右两边读都一样的字符串。例如”aba”是回文,”abc”不是回文。
一个常见的错误
有人很快会想到这样一个方法。这个方法有缺陷,不过很容易修正:
翻转S成为S’。查找S和S’最长公共子串,就是S的最长回文子串。
看起来有道理的样子。用实例检验下。
例如S=”caba”,S’=”abac”。S和S’的最长公共子串是”aba”,确实是S的最长回文子串。
再看个例子。S=”abacdfgdcaba”,S’=”abacdgfdcaba”。
S和S’的最长公共子串是”abacd”,不过很明显这不是回文。

思路一:暴力枚举,以每个元素为中间元素,同时从左右出发,复杂度O(n*n)。

最简单的就是暴力穷举(Brute Force)对每个start和end位置的子串进行检测,判断其是否回文。显然有C(N,2)(组合)个子串。检测每个子串都需要O(N)的时间,所以此方法的时间复杂度为O(N3)。

思路二:动态规划,复杂度O(n2)。设状态为f(i,j),表示区间[i,j] 是否为回文串。则根据回文的规则我们可以知道:

如果s[i] == s[j] 那么是否是回文决定于 dp[i+1][ j - 1]

当 s[i] != s[j] 的时候, dp[i][j] 直接就是 false。

动态规划的进行是按照字符串的长度从1 到 n推进的。

LeetCode-5. Longest Palindromic Substring_第1张图片
要注意圈起来的部分。

但可惜,程序超时。


思路三:Manacher算法, 复杂度O(n)。详细解释见http://leetcode.com/2011/11/longestpalindromic-
substring-part-ii.html 。



你可能感兴趣的:(LeetCode-5. Longest Palindromic Substring)