Leetcode---最長迴文子串--普通解
阿新 • • 發佈:2018-12-05
這裡寫的是普通解法,演算法時間複雜度為O(n^2)
- 這裡我僅僅是為了督促自己每天刷一道演算法題,並不是為了寫出每道題的最優解,在此之前,我僅僅是將Leetcode基礎題刷了一遍。
- 首先丟擲思路,長為n的字串共有n^2個子串,而判斷一個迴文串的方法是設立頭尾指標,從兩邊向中間夾,這樣的到的便是暴力求解,其時間複雜度為O(n ^3),這裡我並沒有給出程式碼。
- 對上面的思路進行優化,可優化的地方在於,如果子串a[i:j]已經不是迴文串,那麼a[i-1:j+1]也一定不是迴文串,所以,我們從字串開頭進行遍歷,找出以該字元為中心的最長迴文串即可,這裡又要分解成兩種情況,如:abcddcba,和abcdcba,均為迴文串,但是其中心,一個為d,一個為dd,分解的情況即為奇偶兩種,下面貼出程式碼
- 這裡提醒大家一定要注意邊界問題,處理邊界花了我好久。。。還是我太渣了,加油!
public class Test05 {
public static void main(String[] args) {
System.out.println(longestPalindrome("aba"));
}
public static String longestPalindrome(String s) {
if(s==null||s.length()==0) {
return "";
}else if(s.length()==1) {
return s;
}
char[] str = s.toCharArray();
//第一種方法,暴力求解
//第二種方法,擴散
int front1 = 0,front2 = 0,rear1 = 0,rear2 = 0;//分別記錄奇偶的最大長度
String result = "";
for(int i = 0;i<str.length-1;i++) {
/**
* 此處注意處理front 和 rear 越界
*/
//奇數,以i為中心擴散
front1=i;rear1=i;
for(;front1>=0&&rear1<=str. length-1&&str[front1]==str[rear1];--front1,++rear1) ;
++front1;
--rear1;
//偶數
front2=i;rear2=i+1;
if(str[front2]!=str[rear2]) {
rear2 = front2;
}else {
for(;front2>=0&&rear2<=str.length-1&&str[front2]==str[rear2];--front2,++rear2) ;
++front2;
--rear2;
}
if(rear1-front1+1>result.length()) {
// System.out.print(i+","+front1+","+rear1);
// System.out.println();
result = s.substring(front1, rear1+1);
}
if(rear2-front2+1>result.length()) {
result = s.substring(front2, rear2+1);
}
}
//第三種方法O(n),有點難
return result;
}
}