1. 程式人生 > >LeetCode-#5-最長迴文子串(Longest Palindromic Substring)

LeetCode-#5-最長迴文子串(Longest Palindromic Substring)

題目:

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 的最大長度為1000。

示例 1:

輸入: "babad"輸出: "bab"注意: "aba"也是一個有效答案。

示例 2:

輸入: "cbbd"輸出: "bb"

這道題我的想法是遍歷字串中所有的字元,對每個字元(假設它在字串中下標是i)判斷它左邊i和右邊i+1是否相同,相同的話再判斷i-1和i+2是否相同,以此類推。每次迴圈都記錄迴文子串的長度,將最長的迴文子串長度len以及中間位置字元的下標index記錄下來,最終擷取字串s,求得結果。

class Solution {
public String longestPalindrome(String s) {
//字串為空就沒必要算了。
        if(s == null || "".equals(s)){
            return "";
        }
//宣告兩個變數,len用來記錄最長迴文子串的長度,index記錄該子串中間字元在字串s中的下標。
//這裡不要問我為啥n=s.length(),看似多此一舉,但是這樣確實快。。。因為不用多此呼叫length()方法。
        int len = 0,index = 0,n=s.length();
//開始迴圈遍歷字串s中的每個字元
        for(int i=0;i<n;i++){
//這裡分兩種情況,一種是奇數情況,一種是偶數情況
//奇數
            if(getLength(s,n,i,i)>len){
                len = getLength(s,n,i,i);
                index = i;
            }
//偶數
            if(getLength(s,n,i,i+1)>len){
                len = getLength(s,n,i,i+1);
                index = i;
            }
        }
//  求得結果,這裡第一個引數中(len-1)的目的是為了讓偶數情況下少取左邊一個多餘的,因為len/2是向左取
//值。不理解的話,舉個例子,加入字串s是”addc”,求得最長迴文子串長度len是2,index是1。那如果截
//取,1-len/2=0,這就是從0取了,而我們取substring(1,3);所以要1-(len-1)/2=1。
        return s.substring(index-(len-1)/2,index+len/2+1);
    }
    public int getLength(String s,int n,int left,int right){
        while(left >= 0 && right < n && s.charAt(left)==s.charAt(right)){
            left--;
            right++;
        }
        return right-left-1;
    }
}

效率還可以,複雜度應該是O(n^2)吧,時間緊迫還要刷別的題,這裡就不探討大佬的解法了。