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 }
測試結果: