1. 程式人生 > >leetcode-最長迴文子串-JAVA

leetcode-最長迴文子串-JAVA

一.題目

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

示例 1:

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

示例 2:

輸入: "cbbd"
輸出: "bb示例 2:

二.解題思路

從1到字串長度開始遍歷,找每個長度可能存在的字串。

注意:每個長度只要找到一個即可,並且注意當前長度存在迴文串的條件為上次迭代存在迴文串或者上上次。注意剪枝操作,否則超時(JAVA),詳細看程式碼

三.原始碼

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/*

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

示例 1:

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

輸入: "cbbd"
輸出: "bb"
 */
public class Solution {
    public static String longestPalindrome(String s) {
        int max=1; //用來記錄上次最長的迴文串長度
        Map<Integer,String> subStringMap=new HashMap<>(); //儲存當前長度對應的迴文串
        subStringMap.put(1,Character.toString(s.charAt(0)));
         int len=s.length();
         boolean flag=false; //當前迭代迴文串存在的條件是,要麼上次迭代存在迴文串,要麼上上次存在
         for(int i=2;i<=len;i++){
             for(int t=0;t+i<=len;t++){
                 if((i-1)!=max&&(i-2)!=max)
                     break;
                 if(flag){
                     flag=false;
                     continue;
                 }
                 String subString=s.substring(t,t+i);
                 if(check(subString)){
                     //注意,只要當前長度找到一個迴文串就可以了,不需要再找了
                     max=i;
                     if(!subStringMap.containsKey(i)) {
                         subStringMap.put(i,subString);
                     }else
                         flag=true;
                     break;
                 }
             }
         }
         return subStringMap.get(max);
    }
    private static boolean check(String subString){
        int len=subString.length();
        int mid=len/2;
        for(int i=0;i<mid;i++){
            //從兩遍向中間靠攏對比
            if(subString.charAt(i)!=subString.charAt(len-1-i))
                return false;
        }
        return true;
    }
    public static void main(String args[]){
        String result=longestPalindrome("babad");
        System.out.println(result);
    }
}