一、题目
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
- 1 <= s.length <= 1000
- s 仅由数字和英文字母组成
二、题解
- string转为chararray方便标记和对比
- 先开一个boolean二维数组dp,长、宽均为s的长度,dp[i][j]表示i到j之间为回文
- 利用for循环遍历两遍,从左端逐步扩大范围,范围内两端往内缩判断是否为回文,相同为true,不同则是false
- 当二者相同,且为aba,aa,a情况就不用内缩判断了
- 每次循环都要更新其实下标和长度下标
三、代码
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
boolean[][] dp = new boolean[len][len];
for (int i = 0; i < len; i ++) {
dp[i][i] = true;
}
char[] sa = s.toCharArray();
int max = 1, start = 0;
for (int j = 1; j < len; j ++) {
for (int i = 0; i < len-1 && i < j; i ++) {
// 字符串两端不相等,不是回文串
if (sa[i] != sa[j]) {
dp[i][j] = false;
}else {
//处理边界情况 aba, aa, a
if (j - i <= 2) {
dp[i][j] = true;
}
else {//内缩,继续判断回文
dp[i][j] = dp[i + 1][j - 1];
}
}
//更新回文串下标最大值
if (dp[i][j] && j - i + 1 > max) {
max = j - i + 1;
// 更新回文串下标的起始位置
start = i;
}
}
}
return s.substring(start, start + max);
}
}
四、结果
五、总结
- 动态规划利用数组记录判断结果
- 回文子串查找不应当是从左右两边开始,因为可能位置不对称,内缩判断会出错
- 短长度特殊情况要判断,节省时间,同时给予内缩结束标记
- 这个题比较难理清楚,本人做的很困难,要再学习一下动态规划
六、说明
本文章仅用于记录个人做题记录 由于本人是个小菜鸡(实锤),题目解法并非最优,且解题过程中参考(抄袭)各大佬解题方法,望见谅。