1. 程式人生 > >Leetcode---最長迴文子串--普通解

Leetcode---最長迴文子串--普通解

這裡寫的是普通解法,演算法時間複雜度為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; } }

執行結果圖