1 题目链接
2 题目描述
描述
对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
给定字符串A以及它的长度n,请返回最长回文子串的长度。
示例
输入:"abc1234321ab",12
返回值:7
3 代码实现
public class Solution {
public int getLongestPalindrome(String A, int n) {
boolean[][] dp = new boolean[n][n]; // 记录从i到j是否回文,这道题目,动态规划用于简化判断回文。如果不用动态规划,还需要一个循环判断回文。abcba串中的bcb串的回文判断是多余的。因为在bcb回文的时候已经判断过了
int max = 0;
char []charArray = A.toCharArray();
// 循环i和循环j找到从i到j的所有字符串
for(int j = 0; j < n; j++){
for(int i = 0; i <= j; i++){
// 两边的值如果相等,则根据i+1到j-1的回文状态得出i到j回文
if(A.charAt(i) == A.charAt(j)){
// 二者同时指向一个位置,或者二者本身相邻,则回文
if(i == j || j - i == 1){
dp[i][j] = true;
}else{
// 否则内部回文则回文
dp[i][j] = dp[i + 1][j - 1];
}
if(dp[i][j] == true){
max = Math.max(max,j - i + 1);
}
}
}
}
return max;
}
}
5 相关例题
class Solution {
public String longestPalindrome(String s) {
boolean [][]dp = new boolean[s.length()][s.length()];
String maxStr = "";
for(int j = 0; j < s.length(); j++){
for(int i = 0; i <= j; i++){
if(s.charAt(i) == s.charAt(j)){
if(i == j || i + 1 == j){
dp[i][j] = true;
}else{
dp[i][j] = dp[i + 1][j - 1];
}
// 区别在这,需要把回文串记录下来
if(dp[i][j] == true && j - i + 1 > maxStr.length()){
maxStr = s.substring(i, j + 1);
}
}
}
}
return maxStr;
}
}