【LeetCode5】Longest Palindromic Substring★★


1.題目描述:

2.解題思路:

  題意:求一個字符串的最長回文子串。

  方法一:中心擴展法。遍歷字符串的每一個字符,如果存在回文子串,那么中心是某一個字符(奇數)或兩個字符的空隙(偶數),然后分兩種情況(奇數或偶數)向兩邊擴展。本文主要介紹這種方法。

  因為回文字符串是以中心軸對稱的,所以如果我們從下標 i 出發,用2個指針向 i 的兩邊擴展判斷是否相等,那么只需要對0到len-1的下標都做此操作,就可以求出最長的回文子串。但需要注意的是,回文字符串有奇偶對稱之分,即"abcba"與"abba"2種類型,因此需要在代碼編寫時都做判斷。
     設函數void extendPalindrome(String s, int j, int k)是求由下標 j和 k 向兩邊擴展的回文串的最大長度,那么對0至ken-1的下標,調用2次此函數,即可求得以i 下標為奇回文和偶回文的最大子串長度。

     該方法時間復雜度為O(n^2),空間復雜度O(1)。

  方法二:動態規划法。暫不介紹,詳情見http://www.programcreek.com/2013/12/leetcode-solution-of-longest-palindromic-substring-java/

3.Java代碼:

 1 //public class LeetCode 為測試代碼
 2 public class LeetCode {
 3     public static void main(String[] args) {
 4        String s="babad";
 5        System.out.println(s+"的最長回文子串是:"+new Solution().longestPalindrome(s));
 6         }
 7 }
 8 
 9 //class Solution為ac代碼
10 class Solution {
11     private static int low;//回文子串的起始位置
12     private static int maxLen;//回文子串的最大長度
13     public String longestPalindrome(String s) {
14         int len=s.length();
15         if(len<2) return s;
16         for(int i=0;i<len;i++){
17             extendPalindrome(s,i,i);//回文子串是奇數的情況
18             extendPalindrome(s,i,i+1);//回文子串是偶數的情況
19         }
20         return s.substring(low, low+maxLen);
21     }
22     private static void extendPalindrome(String s, int j, int k) {
23         while(j>=0&&k<s.length()&&s.charAt(j)==s.charAt(k)){
24             j--;
25             k++;
26         }
27         if(maxLen<k-j-1){
28             low=j+1;
29             maxLen=k-j-1;
30         }
31         
32     }
33 }

測試結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM