NC17-最长回文子串
描述
对于长度为n的一个字符串A(仅包含数字,大小写英文字母),请设计一个高效算法,计算其中最长回文子串的长度。
解答
Approach 1:动态规划
public int getLongestPalindrome(String A) {
// write code here
if (A == null || A.length() == 0) return 0;
int len = A.length();
boolean[][] dp = new boolean[len][len];
int maxLen = 1;
for (int j = 0; j < len; j++) {
for (int i = 0; i <= j; i++) {
boolean equal = A.charAt(i) == A.charAt(j);
dp[i][j] = j - i > 2 ? dp[i + 1][j - 1] && equal : equal;
if (dp[i][j] && j - i + 1 > maxLen) {
maxLen = j - i + 1;
}
}
}
return maxLen;
}
Approach 2:围绕中心展开法
public int getLongestPalindrome2(String s) {
if(s==null||s.length()==0)return 0;
int maxLen=1;
int len = s.length();
for (int i = 0; i < len; i++) {
int len1 = expandAroundCenter(s, i, i);
int len2 = expandAroundCenter(s, i, i + 1);
int max = Math.max(len1, len2);
if(max>maxLen)maxLen=max;
}
return maxLen;
}
public int expandAroundCenter(String s, int left, int right) {
int L = left, R = right;
int len = s.length();
while (L >= 0 && R < len && s.charAt(L) == s.charAt(R)) {
L--;
R++;
}
return R - L - 1;
}