描述
对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
给定字符串A以及它的长度n,请返回最长回文子串的长度。
本题的回文子串长度和相邻字母息息相关,而且每个位置的子串长度都不相同,都可算作一个子状态,因此能够想到动态规划。但本题的转移方程和临界条件,以及dp数组的定义都比较需要动脑:
首先,dp数组定义为二维的boolean型数组,也就是boolean dp[n][n],n为字符串长度,那么数组中的每个元素就代表从i到j能否构成回文串,如果能的话就是true,否则是初始化的false。
有了动态转移数组之后就是遍历和状态转移,前面说过,每个位置能否构成回文串与相邻位置相关,具体体现在:dp[left+1][right-1]如果是true,那么如果left和right位置的字符若相等则dp[left][rght]也是true,否则为false。
一般情况分析完后还有一些边界情况,如:如果left和right处的字符不相等则可以直接跳过判断,如果right-left<=2,即子串长度小于等于3,那么只要left和right字符相等即可,不用考虑其相邻位置的情况。
import java.util.*;
public class Solution {
public int getLongestPalindrome(String A, int n) {
// write code here
int res = 0;
boolean dp[][] = new boolean[n][n];
for(int right = 1;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]&&A.charAt(left)==A.charAt(right);
}
if(dp[left][right]&&right-left+1>res){
res = right-left+1;
}
}
}
return res;
}
}