题目
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
中心扩散法
给定一个字符串,从i处向两边遍历。此时需要分偶数和奇数个字符,若str[i-1]==str[i+1],继续遍历。
public static String longest(String s){
if(s.length() == 0){
return s;
}
int res = 0;
int ll = 0;
int rr = 0;
for (int i =0;i<s.length();i++){
int l = i-1;
int r = i+1;
while(l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r)){
int len = (r - l + 1);
if(len > res){
res = len;
ll = l;
rr = r;
}
l--;
r++;
}
l = i;
r = i+1;
while(l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r)){
int len = (r - l + 1);
if(len > res){
res = len;
ll = l;
rr = r;
}
l--;
r++;
}
}
return s.substring(ll,rr+1);
}```
## DP求解
利用状态矩阵dp[i][j]表示字符串从索引i到j是否是回文串。状态转移方程:


```java
int len = s.length();
if( len <= 1)
return "";
boolean[][] dp = new boolean[len][len];
for(int i = 0; i < len ; i++){
dp[i][i] = true;
}
int max = 1;
int start = 0;
for(int j = 1; j < len; j++){
for(int i = 0; i < j; i++){
if(s.charAt(i) != s.charAt(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 > max){
max = j-i+1;
start = i;
}
}
}
return s.substring(start,start+max);