刷題筆記:leetcode第5題:Longest Palindromic Substring
阿新 • • 發佈:2019-02-16
記錄一下~~
作者刷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); } }
博文不僅僅是防止知識點忘記,也是回饋眾多作者們的教導,以此回饋社會