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代码:
//public class LeetCode 为测试代码
public class LeetCode {
public static void main(String[] args) {
String s="babad";
System.out.println(s+"的最长回文子串是:"+new Solution().longestPalindrome(s));
}
} //class Solution为ac代码
class Solution {
private static int low;//回文子串的起始位置
private static int maxLen;//回文子串的最大长度
public String longestPalindrome(String s) {
int len=s.length();
if(len<2) return s;
for(int i=0;i<len;i++){
extendPalindrome(s,i,i);//回文子串是奇数的情况
extendPalindrome(s,i,i+1);//回文子串是偶数的情况
}
return s.substring(low, low+maxLen);
}
private static void extendPalindrome(String s, int j, int k) {
while(j>=0&&k<s.length()&&s.charAt(j)==s.charAt(k)){
j--;
k++;
}
if(maxLen<k-j-1){
low=j+1;
maxLen=k-j-1;
} }
}
测试结果: