题目描述
给你一个字符串 s,找到 s 中最长的回文子串。
解题思路
这道题目是入门级的动态规划算法,用,j来表示子串的开始位置的下表,用i来表示子串结束位置的下标。 一个子串是回文子串,dp[i][j]是回文子串。写出动态规划方程dp[i][j]=dp[i+1][j-1]&&s.charAt[i]==s.charAt[j]。
AC 代码
class Solution {
public String longestPalindrome(String s) {
int len=s.length();
boolean[][] dp=new boolean[len][len];
int max=1;
int start=0;
for(int i=0;i<len;i++){
for(int j=0;j<=i;j++){
if(i-j==0){
dp[i][j]=true;
}else if(i-j==1){
dp[i][j]=s.charAt(i)==s.charAt(j);
}else{
dp[i][j]=dp[i-1][j+1]&&s.charAt(i)==s.charAt(j);
}
if(dp[i][j]&&i-j+1>max){
max=i-j+1;
start=j;
}
}
}
return s.substring(start,start+max);
}
}
总结
做这种动态规划的题目,细节才是魔鬼,首先我max没有取1,i和j的位置不能搞错了,最后j的取值是0<j<=i