题目
给你一个字符串 s,找到 s 中最长的回文子串。
思路
方法1:中心扩散,遍历元素,找到以该元素为中心的最长回文子串。返回这其中最长的回文子串即可。这里需要注意的是,回文子串可能是奇数也可能是偶数。比如aba奇数,abba偶数。判断的时候,需要先将与当前元素相连的所有左右元素略过。
class Solution {
public String longestPalindrome(String s) {
int l = 0;
int r = 0;
int size = 0;
int len = s.length();
for(int i = 0;i < len;i++) {
//相邻左元素
int left = i - 1;
//相邻右元素
int right = i + 1;
//与当前元素相等的左右元素都略过
while (left >= 0 && s.charAt(left) == s.charAt(i)) {
left--;
}
while (right < len && s.charAt(right) == s.charAt(i)) {
right++;
}
//扩散判断是否回文
while (left >= 0 && right < len && s.charAt(left) == s.charAt(right)) {
left--;
right++;
}
//更新最新长度和初始结束位置
if(size < right - left - 1){
size = right - left - 1;
l = left + 1;
r = right - 1;
}
}
return s.substring(l,r + 1);
}
}
方法2:动态规划
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
boolean[][] dp = new boolean[len][len];
dp[0][0] = true;
for(int i = 0;i < len;i++) {
dp[i][i] = true;
}
int end = 0;
int start = 0;
int size = 1;
for(int i = 1;i < len;i++){
for(int j = 0;j < i;j++) {
if(s.charAt(j) != s.charAt(i)) {
dp[j][i] = false;
continue;
}
if(i - j <= 2 || dp[j + 1][i - 1] == true) {
dp[j][i] = true;
if(i - j + 1 > size) {
size = i - j + 1;
start = j;
end = i;
}
}
}
}
return s.substring(start,end + 1);
}
}
以上。