最长回文串–动态规划
参考:https://writings.sh/post/algorithm-longest-palindromic-substring
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
//为了操作方便,将string变char[]
char[] str = s.toCharArray();
//创建数组,数组下标为回文串结束,数组内容为回文串开始
//如: dp[j] = i; j为回文串结束下标,i为回文串开始下标
int[] dp = new int[len];
dp[0] = 0;
//记录最长回文串的dp下标
int max_index = 0;
for(int j = 1 ;j < len;j++){
//两种情况
//情况一:以j结束的回文串刚好是以j-1结束回味串的扩展,即使dp[j] = dp[j-1] -1
if(dp[j-1]>0 && str[j]==str[dp[j-1]-1])
dp[j] = dp[j-1] - 1;
//情况二:不符合扩展,就要找以j结尾的回文串
else{
int right = j;
int left = dp[j-1];
int start = left;
while(left < right ){
if(str[left] != str[right]){
start = left +1;
right = j;
}else{
right--;
}
left++;
}
dp[j] = start;
}
int max_len = max_index-dp[max_index]+1;
if(max_len < j-dp[j]+1)
max_index = j;
}
return s.substring(dp[max_index],max_index+1);
}
}