最长回文子串
对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
给定字符串A以及它的长度n,请返回最长回文子串的长度。
测试样例:
"abc1234321ab",12
返回:7
方法一:
常规方法,直接遍历找出最大回文串。
import java.util.*;
public class Palindrome {
    public int getLongestPalindrome(String A, int n) {
        int max = 1;
        for(int j = 2; j <= n; j++){
            for(int i = 0; i < j && j - i > max; i++){
                String t = A.substring(i, j);
                if(isHuiWen(t))
                    max = j - i;
            }
        }
        return max;
    }
    public boolean isHuiWen(String str){
        return str.equals(new StringBuffer(str).reverse().toString());
    }
}方法二:
动态规划:
- 用d[i][j]表示从第i到第j个元素是否为回文串,d[i][j]的初始值为false;
 - 若d[i+1][j-1]==true AND A[i]==A[j],则d[i][j]是回文串;
 - 初始情况是d[i][i]=true, i=1,2,3...n-1;
 - 边界考虑:A==null || A为空,返回0。若A.length()==1,返回maxLen的初始值1。
 
import java.util.*;
public class Palindrome {
    public int getLongestPalindrome(String A, int n) {
        if(A == null || A.length() == 0)
            return 0;
        char[] a = A.toCharArray();
        boolean[][] d = new boolean[n][n];
        for(int i = 0; i < n; i++)
            for(int j = 0; j < i; j++)
                d[j][i] = false;
        int maxLen = 1;
        for(int j = 1; j < n; j++){
            d[j][j] = true;
            for(int i = 0; i < j; i++){
                if(j - i == 1 && a[i] == a[j]){
                    d[i][j] = true;
                } else if(d[i + 1][j - 1] && a[i] == a[j]){
                    d[i][j] = true;
                }
                if(d[i][j])
                    maxLen = Math.max(maxLen, j - i + 1);
            }
        }
        return maxLen;
    }
}
京公网安备 11010502036488号