给你一个字符串 s
,找到 s
中最长的回文子串。
示例: 输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
//如果s的长度小于2,那么s本身就是回文串,直接返回
if(len < 2){
return s;
}
//new一个二维数组,表示字符串i到j之间是否是回文串
boolean[][] dp = new boolean[len][len];
//字符串中每一个单独的字符就是一个回文串
for(int i=0;i<len;i++){
dp[i][i] = true;
}
//所以刚开始回文串的最短长度就是1
int maxlen = 1;
int begin = 0;
//L表示回文串的长度,因为最短的回文串是1,所以从2开始
for(int L=2;L<=len;L++){
for(int i=0;i<len;i++){
//j表示,从i开始长度为L的字符串的末尾
int j = L+i-1;
//如果j大于等于了s的长度,直接跳出
if(j>=len){
break;
}
//如果子串中开始和结尾的字符不相等
if(s.charAt(i) != s.charAt(j)){
//那么子串肯定不是回文串
dp[i][j] = false;
}else{
//否则子串中开始和结尾的字符相等,此时如果j-i<3(即子串是1个或2个字符,那么肯定是回文串)
if(j-i<3){
dp[i][j]=true;
}else{
//否则如果j-i>3,就要取决于子串里i+1到j-1位置是否是回文串(即上一个状态是否是回文串)
dp[i][j]=dp[i+1][j-1];
}
}
//这时如果dp[i][j]是true,且j-i+1大于当前最大的子串长度
if(dp[i][j] && j-i+1 > maxlen){
maxlen = j-i+1;
begin = i;
}
}
}
return s.substring(begin,begin+maxlen);
}
}
。