1)题目
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
提示:
- 1 <= s.length <= 1000
- s 仅由数字和英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2)思路
使用动态规划
字符 b a b a b
下标 0 1 2 3 4
l\r 0 1 2 3 4
0 T F T F T
1 T F T F
2 T F T
3 T F
4 T
先判断01;再判断02,12; 03,13,23;...
3)代码
public static String longestPalindrome(String s) {
char[] chars = s.trim().toCharArray();
int length = chars.length;
// 单字符都是回文串
if (length == 1) return s;
String maxStr = s.substring(0, 1);
// 初始化
Boolean[][] dp = new Boolean[length][length];
for (int i = 0; i < length; i++) {
dp[i][i] = true;
}
// 填表规则:先一列一列的填写,再一行一行的填,保证左下方的单元格先进行计算
for (int right = 1; right < length; right++) {
for (int left = 0; left < right; left++) {
// 头尾不相等,不是回文串
if (chars[left] != chars[right]) {
dp[left][right] = false;
continue;
}
// 相等的情况下,考虑头尾去掉以后没有字符剩余,或者剩下一个字符的时候,肯定是回文串
if (right - left < 3) {
dp[left][right] = true;
} else {
// 状态转移
dp[left][right] = dp[left + 1][right - 1];
}
// 只要dp[i][j] == true 成立,表示s[i...j] 是回文串
// 此时更新记录回文长度和起始位置
if (dp[left][right] && right - left + 1 > maxStr.length()) {
maxStr = s.substring(left, right + 1);
}
}
}
return maxStr;
}