刷题笔记:leetcode第5题:Longest Palindromic Substring

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37590135/article/details/80140197

记录一下~~

    作者刷leetcode刷到吐血,第五题感觉没有太好的官方解决方法,我是这么做的

    问题:


    思路:由于字符串可能很大,消耗计算量的做法肯定是不能用的,最后只遍历一次,找出所有回文

        1、遍历每个字符

       2、每次得到字符后,再循环,比如得到某字符a[i],则看看a[i+1]和a[i-1]是否相等,a[i]和a[i+1]是否相等,等等多种情况,这只是举个例子,若那个“1”值可以自增的话,那算法也就出来了。代码如下:


    作者逻辑思维没那么强大,所以好多异常情况,写了一堆if,上代码:

class Solution {
    public String longestPalindrome(String s) {
        int start = 0; //起始指针
        int end = 0; //结束指针
        char[] c = s.toCharArray();
        wai:
        for(int i = 0;i < c.length;i++){
            int j = 0;
            int model = -1;//-1为初始,0时就是没有,1为单右,2为单左,3为两边,4为自己,5为对称,且全一样

            int nowlength = end - start + 1;
            for(;j + i < c.length + 1 &&  i-j > -2 ;j++){
                if((end-start)/2 == 0 && end == 0){
                    model = 4;
                    end = 1;
                    continue ;
                }
                if((model == 3 || model == -1 || model == 4 || model == 5)&&j + i < c.length  &&  i-j > -1 &&c[i+j] == c[i-j]){
                    if(model == 5 || (model == 4 && c[i+j] == c[i])){
                        model = 5;
                    }else{
                        model = j==0?4:3;
                    }
                }else if(model != 2 && model != 3&&j + i < c.length &&c[i+j] == c[i-j+1] && c[i+j-1] == c[i -j+2]){
                    model = 1;
                }else if(model != 1 && model != 3 &&  i-j > -1 &&  c[i+j-1] == c[i-j] && c[i+j-2] == c[i -j+1]){
                    model = 2;
                }else if(model == 0 || j + i >= c.length  ||  i-j <= -1 || (model == 3 && j != 0)){
                    break;
                }else {
                    if(model == 1 || model == 2 || model == 5) break ;
                    model = 0;
                }
            }

            switch (model){
                case 0:continue wai;
                case 1:
                    if(j*2-1 < nowlength) break ;
                    end = i+j;
                    start = i-j+2;
                    break ;
                case 2:
                    if(j*2-1 < nowlength) break ;
                    end = i+j-1;
                    start = i-j+1;
                    break ;
                case 3:
                    if(j*2-1 < nowlength) break ;
                    end = i+j;
                    start = i-j+1;
                    break ;
                case 5:
                    if(j*2-1 < nowlength) break ;
                    end = i+j;
                    start = i-j+1;
                    break ;
            }

        }

        return s.substring(start,end);
    }
}


博文不仅仅是防止知识点忘记,也是回馈众多作者们的教导,以此回馈社会

猜你喜欢

转载自blog.csdn.net/m0_37590135/article/details/80140197