描述
对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
给定字符串A以及它的长度n,请返回最长回文子串的长度。
示例1
输入:"abc1234321ab",12
返回值:7
解体思路
思路一
暴力求解,求出所有字串,判断是否为回文数,代码如下:
public int getLongestPalindrome(String A, int n) {
// write code here
int maxCount = 0;
for (int i = 0; i < A.length(); i++) {
for (int j = i; j < A.length(); j++) {
boolean palindrome = isPalindrome(A.substring(i, j + 1));
if (palindrome) {
maxCount = Math.max(maxCount, j - i + 1);
}
}
}
return maxCount;
}
private boolean isPalindrome(String substring) {
String s = new StringBuilder(substring).reverse().toString();
if (s.equals(substring)) {
return true;
}
return false;
}
复杂度分析:
时间复杂度:
O
(
N
3
)
O(N^3)
O(N3),两次循环,一次判断是否为回文数。
空间复杂度:
O
(
N
)
O(N)
O(N),判断是否为回文数。
思路二
动态规划法,求出递归公式,为 d p [ l e f t ] [ r i g h t ] = d p [ l e f t + 1 ] [ r i g h t − 1 ] dp[left][right] = dp[left + 1][right - 1] dp[left][right]=dp[left+1][right−1]代码如下:
public int getLongestPalindrome(String A, int n) {
// write code here
boolean[][] dp = new boolean[n][n];
int maxLength = 0;
for (int right = 0; right < n; right++) {
for (int left = 0; left <= right; left++) {
if (A.charAt(left) != A.charAt(right)) {
continue;
}
if (right - left <= 2) {
dp[left][right] = true;
} else {
dp[left][right] = dp[left + 1][right - 1];
}
if (dp[left][right] && (right - left + 1) > maxLength) {
maxLength = right - left + 1;
}
}
}
return maxLength;
}
复杂度分析:
时间复杂度:
O
(
N
2
)
O(N^2)
O(N2),每个节点只遍历一次,所以只需要N复杂度。
空间复杂度:
O
(
N
2
)
O(N^2)
O(N2),需要数组保存数据。