思路:使用动态规划方法,动态规划的精髓就是找到dp函数的状态转移方程和边界条件
状态转移方程:dp[i][j] = s[i]==s[j] &&dp[i+1][j-1]
边界条件:1.长度为1,则为true;2. s[i]==s[j] &&(j-1)-(i+1)<1(也就是说只有两个值的时候 j-i<3)
初始化:d[i][j] = true;
需要注意的是:在循环的时候要将j的循环放置在外层,不然就会报错,原因是,如果i放置在外面的话,dp[i+1]还没有计算出来
class Solution {
public String longestPalindrome(String s) {
int length = s.length();
Boolean [] [] dp = new Boolean[length][length];
int maxlen = 1,begin =0;
//定义一个二维数组,用来标识是否是回文数组,将对角线的部分设置为true
for (int i= 0;i<s.length();i++){
dp[i][i] = true;
}
//将字符串转换为对应的数组
char[] charArray = s.toCharArray();
for (int j = 1;j<s.length();j++){
for (int i =0;i<s.length()-1;i++){
// for (int j =1;j<s.length();j++){
// for (int i = 0;i<j;i++){
if(charArray[i]!=charArray[j]){
dp[i][j] = false;
}else{
if(j-i<3){
dp[i][j]=true;
}else{
dp[i][j] = dp[i+1][j-1];
}
}
if (dp[i][j] &&j-i+1>maxlen){
maxlen = j-i+1;
begin = i;
}
}
}
return s.substring(begin,begin+maxlen);
}
}