给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
- 首先我们要了解回文串是怎样的字符串,回文串就是一个对称的结构,左右对应位置的字符相等,比如abba,acacbcaca,像abab这种就不是回文串,那了解了这样的结构,我们就能想到是用动态规划来解决了,它要划分成很多子问题。大概的思路就是如果一个字串左右两边字母相等,那么去除左右两边的字符,剩下的字符串还是回文串的话,原串也是回文串。
java
class Solution {
public String longestPalindrome(String s) {
int max = 0;
String str = "";
boolean dp[][] = new boolean[s.length() + 1][s.length() + 1];
for (int i = s.length() - 1; i >= 0; i --) {
for(int j = i; j < s.length(); j ++){
// j - i <= 1这个条件是一个细节,如果字串长度小于等于1那他一定是回文串
if(s.charAt(i) == s.charAt(j) && (j - i <= 1 || dp[i + 1][j - 1])){
dp[i][j] = true;
if (j - i + 1 > max){
max = Math.max(max, j - i + 1);
str = s.substring(i, j + 1);
}
}
}
}
return str;
}
}
大家有问题的话可以留言