题目:
给你一个字符串 s
,找到 s
中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
方法一:
动态规划
例如子串:abba 去除收尾i,j [i+1, j-1]是回文串的话,那么子串必定是回文串
class Solution {
public String longestPalindrome(String s) {
// 求字符串长度
int len = s.length();
// 边界条件 长度为1或为2
if(len == 1){
return s;
}
// if(len == 2){
// if(s.charAt(0) == s.charAt(1)){
// return s;
// }
// }
// 定义状态转移数组 表示s[i,j]是否为回文串
boolean[][] dp = new boolean[len][len];
// 初始化 所有长度为1的子串都是回文串
for(int i = 0; i < len; i++){
dp[i][i] = true;
}
// 子串开始的位置
int begin = 0;
int maxLen = 1;
for(int L = 2; L <= len; L++){
// 枚举左边界
for(int i = 0; i < len; i++){
// 确定右边界 j-i + 1 = L;
int j = L + i - 1;
// 若右边界越界 退出循环
if(j >= len){
break;
}
// 若左右边界值不相等 返回false
if(s.charAt(i) != s.charAt(j)){
dp[i][j] = false;
}else{
// 考虑 aba aa这种情况 是回文串
if(j - i < 3){
dp[i][j]= true;
}else{
// 动态转移方程 若左右边界值相等 判断[i+1, j-1]是否为回文串
dp[i][j] = dp[i+1][j-1];
}
}
// 若dp[i][j]为true ,记录回文串长度和起始位置
if(dp[i][j] && j-i+1 > maxLen ){
maxLen = j - i + 1;
begin = i;
}
}
}
// 返回最大回文子串
return s.substring(begin, begin + maxLen);
}
}