1. 程式人生 > >leetcode 求最長迴文串

leetcode 求最長迴文串

題目:Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
        樣例:“babad”   答案為 : "aba"

        題目大意:給定一個字串,找出該字串中最長的迴文串,資料範圍為1000長度。

       

 這個題大致解體思路是這樣的:

        1>.首先要明白迴文串的含義 就是一個字串從中間對稱(也就是說一個字串從中間開始兩邊都是相同的字元)


        2>.明白了迴文串,那麼接下來的問題就是問題分類了:

        1).首先一個字串的長度分為 偶數 和 奇數,那麼問題就可以劃分為2個小問題,第一個就是當字串是奇數的時候,那麼該字串肯定關於中間某個字元對稱("ababa" 該字串關於a對稱),第二個就是當字串為偶數的時候,那麼該字串就是關於某個“縫隙”對稱(“abba”就是關於兩個b中間的縫隙對稱)。

        3>.經過了問題劃分,接下來就是遍歷 暴力求解的過程了,大體思路就是:設定一個存 答案 的字串longest並初始化為第一個字元長度(就是初始化為一),接下來每一次運算都要處理上述第二條說說的兩種情況,進行暴力求解。

        4>.程式碼如下:

public class Main {
    public String expend(String s,int c1,int c2){
        int left = c1;int right = c2;
        int n = s.length();//求得傳入字串長度
        while(left >= 0 && right <= n-1 && s.charAt(left) == s.charAt(right)){
            left--;
            right++;
        }
        if(left == c1 && right == c2){
            return ""; //這裡當不操作時,就返回空串,直接就不考慮會影響答案!!
        }else{
            return s.substring(left+1, right);  //一旦left right被改變 最後一次操作左邊就多減了一次 右邊就多加了一次!!! 所以這裡java substring要這樣寫
        }

    }

    public String longestPalindrome(String s){
        int n = s.length();
        if(n==0) return "";
        String longest = s.substring(0, 1);
        for(int i=0;i<n-1;i++){  //遍歷查詢 每個結點有兩種情況 整個字串是奇數 或者 整個字串是偶數
            String p1 = expend(s, i, i); //處理字串是奇數的情況
            if(p1.length() > longest.length()){
                longest = p1;
            }

            String p2 = expend(s,i,i+1); //處理字串是偶數的情況
            if(p2.length() > longest.length()){
                longest = p2;
            }
        }

        return longest;
    }
    public static void main(String[] args){
        Main m  = new Main();


        System.out.println(m.longestPalindrome("babad"));
    }

}