5. Longest Palindromic Substring

来源:互联网 发布:apache服务器优点 编辑:程序博客网 时间:2024/06/05 23:40

题意:Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example:

Input: “babad”

Output: “bab”

Note: “aba” is also a valid answer.

Example:

Input: “cbbd”

Output: “bb”

思路:这题一开始想用循环做,但是由于奇数字符和偶数字符回环串的判定方式不同,所以一开始写了一堆的if条件,最后还一直WA,但是后来看到一个哥们的一串java代码,我才发现自己想多了,可能是冬天空调吹傻了。。。
参考代码:

public class Solution {private int lo, maxLen;public String longestPalindrome(String s) {    int len = s.length();    if (len < 2)        return s;    for (int i = 0; i < len-1; i++) {        extendPalindrome(s, i, i);  //assume odd length, try to extend Palindrome as possible        extendPalindrome(s, i, i+1); //assume even length.    }    return s.substring(lo, lo + maxLen);}private void extendPalindrome(String s, int j, int k) {    while (j >= 0 && k < s.length() && s.charAt(j) == s.charAt(k)) {        j--;        k++;    }    if (maxLen < k - j - 1) {        lo = j + 1;        maxLen = k - j - 1;    }}}

但是这个方法的复杂度还是O(n^2)的,但其实这里还有一个Manacher’s algorithm,可以在O(n)的复杂度下完成,附一个我认为最好理解的一个博客 Manacher’s algorithm,这个博客讲的比较通俗,具体算法我就不说了,主要是要去理解,前面算过的较长的环回串对之后的字串会有帮助,所以不用像以前那样去遍历了:

class Solution(object):    def longestPalindrome(self, s):        T = ['#']        for i in s:            T += ['#', i]        T += ['#', '$']        mx, id = 0, 0        P = [0] * len(T)        for i in xrange(1, len(T)-1):            if mx > i:                P[i] = min(P[2 * id - i], mx-i)            else:                P[i] = 1            while T[i + P[i]] == T[i - P[i]]:                P[i] += 1            if i+P[i] > mx:                mx = i + P[i]                id = i        max, max_idx = 0, 0        for i in xrange(len(P)):            if P[i] > max:                max, max_idx = P[i], i        return s[(max_idx-max)/2:(max_idx+max)/2-1]
0 0