class Solution {
public String longestPalindrome(String s) {
char[] charArr = s.toCharArray();
int n = charArr.length;
boolean[][] dp = new boolean[n][n];
int maxLenth = 1;
int start = 0;
for(int j=1;j<n;j++){
for(int i=0;i<j;i++){
if(charArr[i] != charArr[j])
continue;
else{
if(j-i<=2){
dp[i][j] = true;
}else{
dp[i][j] = dp[i+1][j-1];
}
if(dp[i][j] == true){
if(j-i+1>maxLenth){
maxLenth = j-i+1;
start = i;
}
}
}
}
}
return s.substring(start,start + maxLenth);
}
}
题解:
暴力求法:
ij两层循环把所有子串求出来,再定义一个方法,使用双指针判断字符串是否是回文字符串,分别判断每一个子串是否是回文子串,记录最长长度和开始位置。
动态规划:
主要是考虑到回文子串的性质,回文子串包裹着回文子串,也就是说,如果dp[i][j]代表以索引【i】开始到索引【j】结束的字符串为回文子串(值为true),则dp[i+1][j-1]也为true,所以省去了再一个一个判断的时间。