最长回文子串
对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
给定字符串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号