题目
给你一个字符串 s,找到 s 中最长的回文子串。
解题思路
i字串开始位置,j字串结束位置。
核心思想当一个字串{i,j}是回文字符串的时候,那么{i+1,j-1}也一定会是一个回文字串
使用一个数组dp来保存{i,j}是不是一个回文子串。 保存最大的字串长度,当有回文子串长度大于当前最大的时候替换掉。
代码
class Solution {
public String longestPalindrome(String s) {
if (s.length() < 2){
return s;
}
int len = s.length();
boolean[][] dp = new boolean[len][len];
int begin = 0;
int maxLen = 1;
// 假设字串的长度,从2最小,到整个串的大小
for(int l = 2;l <= len ; l++){
for (int i = 0; i < len; i++) {
int j = i + l -1;//开始位置,+子串长度 -1 得到i + 子符串长度对应的 j点
if (j >= len){
break;//数组下表越界了,退出内层循环
}
if (s.charAt(i)!=s.charAt(j)){
dp[i][j] = false;
}else {
if (j - i + 1 <= 3){//j - i + 1 得到字串的长度,长度为2or3的情况直接赋值为true,因为已经是最内层了
dp[i][j] = true;
}else {
dp[i][j] = dp[i+1][j-1];//外层字串相等的情况,是不是回文字串取决于类层的子串是不是回文字串
}
}
//更新最长字串,当前的i-j是回文字串,且长度大于最长的,替换到最长的
if(dp[i][j] && j - i + 1 > maxLen){
maxLen = j - i + 1;
begin = i;
}
}
}
return s.substring(begin,begin+maxLen);
}
}