题目描述
思路解析
一个字符串S[left,right]
,表示从下标为left到right的子串。
判断这个字符串是不是回文序列,取决于它两端的字符char[left]
、char[right]
以及内侧的S[left+1,right-1]
有关,这里的递推公式是(dp[i][j]
是boolean
类型的值,表示S[i][j]
是否是一个回文序列):
dp[left][right] = dp[left+1][right-1] ^ if(char[left] == char[right])
当然了,长度为1的子串,必然是一个回文序列
代码实现
class Solution {
public String longestPalindrome(String s) {
//记录字符串的长度
int len = s.length();
//如果长度小于2,那必然是一个回文序列,直接返回
if(len < 2)return s;
//因为要记录最长的回文子串,需要初始化当前最长回文子串的起始下标以及子串最大长度
int begin = 0;
int maxLen = 1;
//dp[i][j]表示s(i,j)是不是一个回文序列
boolean dp[][] = new boolean[len][len];
for(int i = 0 ; i < len ; ++i){
dp[i][i] = true; //所有长度为1的子串都是回文序列
}
//将字符串转换成字符数组
char[] charArr = s.toCharArray();
//通过枚举字符串长度,来判断当前字符串是不是回文序列
for(int L = 2; L<= len; ++L){
for(int left = 0; left < len; ++left){//left表示最左边的初始下标
int right = left + L -1; //定位最右边的下标
if(right >= len)break; //超出范围就越界了
else{
if(charArr[left] != charArr[right])dp[left][right] = false;
else{//如果最外边界2个字符串相等的话
if(L<4)dp[left][right] = true;
else{
dp[left][right] = dp[left+1][right-1];
}
if(dp[left][right] == true && L > maxLen){
begin =left;
maxLen = L;
}
}
}
}
}
return s.substring(begin,begin+maxLen);
}
}