【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 }
测试结果: