5. 最长回文子串
题目:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
解法:动态规划
思路:数学符号:dp[i][j]表示s[i-j]是否为回文子串;状态转移方程:按列填表,当i=j时都为true,当j=i+1时,只需判断两个字符是否相等,其他情况dp[i][j]=(dp[i+1][j-1]&&(s.charAt(i)s.charAt(j)));
代码:
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
if(len0){
return null;
}
if(len1){
return s;
}
boolean[][] dp = new boolean[len][len]; //dp[i][j]表示s[i-j]是否为回文子串
for(int i=0;i<len;i++){
dp[i][i] = true;
}
//按列填,这样才能保证对于每个ij来说,dp[i+1][j-1]是已知的
String longestStr = s.substring(0,1); //存放最长回文子串
int maxLength = 1; //最长回文子串的长度
for(int j=1;j<len;j++){
for(int i=0;i<j;i++){
if(i+1j){
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]==true&&(j-i+1>maxLength)){
longestStr = s.substring(i,j+1);
maxLength = j-i+1;
}
}
}
return longestStr;
}
}

浙公网安备 33010602011771号