1. 程式人生 > >刷題筆記:leetcode第5題:Longest Palindromic Substring

刷題筆記:leetcode第5題:Longest Palindromic Substring

記錄一下~~

    作者刷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);
    }
}

博文不僅僅是防止知識點忘記,也是回饋眾多作者們的教導,以此回饋社會