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 }

测试结果:

 

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!