leetcode Longgest Palindrome Substring

来源:互联网 发布:北京大学远程网络教育 编辑:程序博客网 时间:2024/05/17 23:41

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.

三种思路,一种是dp,一种是逐个延伸对称检测,还有一种比较高级的Manacher算法.

首先dp,这个我觉得是除了暴力解法之外比较容易想到的一种,我们另开一个boolean类型的二维数组,记录从i到j是否为回文数组,这样当我们在进行长度+2的判断的时候就不需要重新计算一遍,只需要计算i-1和j+1处索引的字符是否相等就可以了,代码:

public String longestPalindrome1(String s) {    int len=s.length();    if(len==0) return "";    int max=1;    int beginindex=0;    int endindex=0;    boolean[][] isPalindrome=new boolean[len][len];    for(int i=0;i<len;i++)        isPalindrome[i][i]=true;    for(int i=0;i<len-1;i++){        if(s.charAt(i)==s.charAt(i+1)) {            isPalindrome[i][i + 1] = true;            beginindex=i;            endindex=i+1;        }    }    for(int length=3;length<=len;length++){        for(int i=0;i+length-1<len;i++){            if(s.charAt(i)==s.charAt(i+length-1)&&isPalindrome[i+1][i+length-2]){                    endindex=i+length-1;                    beginindex=i;                    isPalindrome[i][i+length-1]=true;            }        }    }    return s.substring(beginindex,endindex+1);}
dp的时间复杂度和空间复杂度都是O(n^2)

第二种方法是时间复杂度O(n^2),空间复杂度O(1)的算法,算法本身思想很简单,从长度为n的字符串的2n-1个点出发向两侧延伸,取其中长度最长的字符串,为什么是2n-1呢,举个例子很容易明白 abba 我们分别需要从a ab之间 b bb之间 b ba之间 a这七个点进行延伸,代码:

public String longestPalindrome(String s) {    int len=s.length();    if(len<=1) return s;    int maxlength=0;    String maxstring="";    for(int i=0;i<len-1;i++){        String s1=getMaxString(s,i,i);        if(s1.length()>maxlength){            maxlength=s1.length();            maxstring=s1;        }        String s2=getMaxString(s,i,i+1);        if(s2.length()>maxlength){            maxlength=s2.length();            maxstring=s2;        }    }    return maxstring;}public String getMaxString(String s,int begin,int end){    int len=s.length();    while(begin>=0&&end<len&&s.charAt(begin)==s.charAt(end)){        begin--;        end++;    }    return s.substring(begin+1,end);}
第三个算法解释起来较为复杂,http://www.cnblogs.com/bitzhuwei/p/Longest-Palindromic-Substring-Part-II.html博主解释的非常清晰,建议大家有兴趣一定要看一看,这道题作为面试题的频率比较高,如果能拿出这个算法装个逼感觉还是挺爽的~我这里就贴下代码:

public String longestPalindrome(String s) {
        String temp="";
        for(int i=0;i<s.length();i++){
            temp=temp+"#"+s.charAt(i);
        }
        temp+="#";
        int[] length=new int[temp.length()];
        int C=0,R=0;
        for(int i=1;i<temp.length();i++){
            int mir=2*C-i;
            int dif=R-i;
            if(dif>=0){
                if(length[mir]<dif) length[i]=length[mir];
                else{
                    length[i]=dif;
                    while(i+length[i]+1<length.length&&i-length[i]-1>=0&&temp.charAt(i+length[i]+1)==temp.charAt(i-length[i]-1)){
                        length[i]++;
                    }
                    C=i;
                    R=i+length[i];
                }
            }
            else{
                length[i]=0;
                while(i+length[i]+1<length.length&&i-length[i]-1>=0&&temp.charAt(i+length[i]+1)==temp.charAt(i-length[i]-1)){
                    length[i]++;
                }
                R=i+length[i];
                C=i;
            }
        }
        int max=-1,index=0;
        for(int i=0;i<length.length;i++){
            if(length[i]>max){
                max=length[i];
                index=i;
            }
        }
        return s.substring((index-max)/2,(index+max)/2);


    }

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 眼周围发干皱纹怎么办 眼周围淤血肿了怎么办 每到秋季就咳嗽怎么办 左肾泥沙样结石怎么办 双肾泥沙样结石怎么办 温州市民卡丢了怎么办 上眼皮过敏肿了怎么办 上眼皮又痒又肿怎么办 上眼皮红肿痛是怎么办 上眼皮肿的厉害怎么办 眼皮肿了还痒痒怎么办 眼睛被手指戳到怎么办 打球眼睛撞肿了怎么办 打球时眼睛被戳怎么办 狗眼睛被打充血怎么办 一只眼睛磨的慌怎么办 5个月宝宝结膜炎怎么办 金毛眼屎多白色怎么办 金毛眼红有眼屎怎么办 狗狗眼睛上火了怎么办 狗上火了眼屎多怎么办 金毛走路扭腰怎么办 金毛流鼻涕微黄怎么办 狗狗下眼皮红了怎么办 金毛眼睛打肿了怎么办 金毛的眼睛红怎么办 眼睛干涩有红血丝怎么办 小孩子眼睛红有眼屎怎么办 狗狗的肉垫粗糙怎么办 狗狗眼睛变蓝色怎么办 脸被太阳晒伤了怎么办 皮肤晒伤红肿痒怎么办 3岁儿童频繁眨眼怎么办 狗狗的眼睛红肿怎么办 脸过敏发红怎么办不痒 上眼皮红肿痒是怎么办 眼睛痒了几天了怎么办 眼睛肿了还痒怎么办 孩子脸上有红血丝怎么办 脸上长了红血丝怎么办 指甲受创出血了怎么办