1. 题目描述
给你一个字符串 s,找到 s 中最长的回文子串。
2. 思路
(1)定义状态:dp[i][j] 表示s[i…j] 是否是回文串
(2)得到状态转移方程:dp(i,j)=dp(i+1,j−1)∧s(i)==s(j),即从外向里收缩;
(3)初始化状态:长度为1的字符串为true。
3. 代码
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
if(len<2)
return s;
int maxLen = 1;
int begin = 0;//开始索引
char[] str = s.toCharArray();
// dp[i][j] 表示str[i...j] 是否是回文串
boolean[][] dp = new boolean[len][len];
//初始化长度为1的字符串
for(int i=0;i<len;i++)
dp[i][i] = true;
//从左下角开始
for(int j=1;j<len;j++){
for(int i=0;i<j;i++){
if(str[i] != str[j]){//不是回文子串
dp[i][j] = false;
}else{
//如果去掉头尾时,中间的字符串长度小于2时,则为回文子串
if(j-i-1<2) {
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);
}
}