Middle-题目106:5. Longest Palindromic Substring

原创 2016年05月31日 19:57:47

题目原文:
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
题目大意:
求出字符串S的最长回文子串。
题目分析:
使用了discuss的神算法,我根本看不懂……求大神解答……(好像还是个O(n2)的算法)大概是每向右增加一个字符,就判断能不能向左延伸之类的。
本题有一个线性算法,叫manacher算法,参见https://en.wikipedia.org/wiki/Longest_palindromic_substring#CITEREFManacher1975
源码:(language:java)
方法一:

public class Solution {
    public String longestPalindrome(String s) {
        char[] ca = s.toCharArray();
        int rs = 0, re = 0;
        int max = 0;
        for(int i = 0; i < ca.length; i++) {
            if(isPalindrome(ca, i - max - 1, i)) {
                rs = i - max - 1; re = i;
                max += 2;
            } else if(isPalindrome(ca, i - max, i)) {
                rs = i - max; re = i;
                max += 1;
            }
        }
        return s.substring(rs, re + 1);
    }

    private boolean isPalindrome(char[] ca, int s, int e) {
        if(s < 0) return false;

        while(s < e) {
            if(ca[s++] != ca[e--]) return false;
        }
        return true;
    }
}

方法二:(manacher算法,改编自wikipaedia上的代码)

public class Solution {
    public String longestPalindrome(String s) {
        if (s==null || s.length()==0)
            return "";
        char[] s2 = addBoundaries(s.toCharArray());
        int[] p = new int[s2.length]; 
        int c = 0, r = 0; // Here the first element in s2 has been processed.
        int m = 0, n = 0; // The walking indices to compare if two elements are the same
        for (int i = 1; i<s2.length; i++) {
            if (i>r) {
                p[i] = 0; m = i-1; n = i+1;
            } else {
                int i2 = c*2-i;
                if (p[i2]<(r-i)) {
                    p[i] = p[i2];
                    m = -1; // This signals bypassing the while loop below. 
                } else {
                    p[i] = r-i;
                    n = r+1; m = i*2-n;
                }
            }
            while (m>=0 && n<s2.length && s2[m]==s2[n]) {
                p[i]++; m--; n++;
            }
            if ((i+p[i])>r) {
                c = i; r = i+p[i];
            }
        }
        int len = 0; c = 0;
        for (int i = 1; i<s2.length; i++) {
            if (len<p[i]) {
                len = p[i]; c = i;
            }
        }
        char[] ss = Arrays.copyOfRange(s2, c-len, c+len+1);
        return String.valueOf(removeBoundaries(ss));
    }
    private  char[] addBoundaries(char[] cs) {
        if (cs==null || cs.length==0)
            return "||".toCharArray();

        char[] cs2 = new char[cs.length*2+1];
        for (int i = 0; i<(cs2.length-1); i = i+2) {
            cs2[i] = '|';
            cs2[i+1] = cs[i/2];
        }
        cs2[cs2.length-1] = '|';
        return cs2;
    }
    private  char[] removeBoundaries(char[] cs) {
        if (cs==null || cs.length<3)
            return "".toCharArray();

        char[] cs2 = new char[(cs.length-1)/2];
        for (int i = 0; i<cs2.length; i++) {
            cs2[i] = cs[i*2+1];
        }
        return cs2;
    }    
}

成绩:
方法一:9ms,beats 96.88%,众数13ms,4.50%
方法二:11ms,beats 92.14%
cmershen的碎碎念:
Manacher, Glenn (1975), “A new linear-time “on-line” algorithm for finding the smallest initial palindrome of a string”, Journal of the ACM 22 (3): 346–351, doi:10.1145/321892.321896.
这篇论文详细论证了Manacher算法,如果无聊可以研究一下。
方法二不如方法一快是因为数据量不够大(S.length<10^3),且此题个人认为应归为hard。

版权声明:完整版Leetcode题解请出门左转https://github.com/cmershen1/leetcode/tree/master/docs

LeetCode(5) Longest Palindromic Substring

如果一个字符串从左向右写和从右向左写是一样的,这样的字符串就叫做palindromic string,如aba,或者abba。给定输入一个字符串,要输出一个子串,使得子串是输入字符串的最长的padro...
  • feliciafay
  • feliciafay
  • 2013年11月27日 14:00
  • 17814

LeetCode 5 Longest Palindromic Substring(C,C++,Python,Java)

Problem: Given a string S, find the longest palindromic substring in S. You may assume that the ma...
  • runningtortoises
  • runningtortoises
  • 2015年05月06日 15:38
  • 1347

LeetCode-5-Longest Palindromic Substring(动态规划)-Medium

题意理解: 求解最长的回文; 题目分析: 1. 通过遍历完成,但算法的复杂度过高(O(N3)); 2. 采用动态规划,复杂度为O(N2)(先前以为所谓的动态规划,就是像《算法导论》里车间的那个例子...
  • eddy_liu
  • eddy_liu
  • 2015年12月20日 16:49
  • 363

LeetCode5——Longest Palindromic Substring 最易懂的解法

Given a string S, find the longest palindromic substring in S. You may assume that the maximum l...
  • booirror
  • booirror
  • 2016年01月22日 23:05
  • 910

Leetcode 5. Longest Palindromic Substring 新补充Manacher算法

5. Longest Palindromic Substring Total Accepted: 98755 Total Submissions: 434700 Difficulty: Medi...
  • fantasiasango
  • fantasiasango
  • 2016年03月15日 09:34
  • 524

LeetCode 5:Longest Palindromic Substring

Given a string S, find the longest palindromic substring in S. You may assume that the maximum len...
  • sunao2002002
  • sunao2002002
  • 2015年05月12日 00:38
  • 2637

[LeetCode]5 Longest Palindromic Substring(C++,Python实现)

LeetCode OJ的第五题,如果有问题或者给我指点欢迎来信讨论ms08.shiroh@gmail.com 题目描述...
  • Shiroh_ms08
  • Shiroh_ms08
  • 2014年05月23日 21:28
  • 3111

LeetCode --- 5. Longest Palindromic Substring

题目链接:Longest Palindromic Substring Given a string S, find the longest palindromic substring in S. Y...
  • makuiyu
  • makuiyu
  • 2015年01月27日 22:25
  • 797

Java Longest Palindromic Substring(最长回文字符串)

如果一个字符串从左向右写和从右向左写是一样的,这样的字符串就叫做palindromic string,如aba,或者abba。本题是这样的,给定输入一个字符串,要求输出一个子串,使得子串是最长的pad...
  • soszou
  • soszou
  • 2014年07月06日 10:38
  • 16279

Longest Palindromic Substring -- LeetCode

原题链接: http://oj.leetcode.com/problems/longest-palindromic-substring/  这道题是比较常考的题目,求回文子串,一般有两种方法。 第一种...
  • linhuanmars
  • linhuanmars
  • 2014年03月10日 03:49
  • 20081
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Middle-题目106:5. Longest Palindromic Substring
举报原因:
原因补充:

(最多只允许输入30个字)