1.题目描述:
给你一个字符串s,找到s中最长的回文子串。
2.动态规划:
做法和leetcode647. 回文子串一样,区别是一个返回回文子串的数量,一个返回最长回文子串。
class Solution {
public String longestPalindrome(String s) {
boolean[][] dp = new boolean[s.length()][s.length()];
int max = 0;
int left = 0;
int right = 0;
for (int i = s.length() - 1; i >= 0; i--) {
for (int j = i; j < s.length(); j++) {
if (s.charAt(i) == s.charAt(j)) {
if (j - i <= 1 || dp[i + 1][j - 1]) {
dp[i][j] = true;
if (j - i > max) {//记录最长回文子串的信息
max = j - i;
left = i;
right = j;
}
}
}
}
}
return s.substring(left, right + 1);
}
}
3.双指针:
class Solution {
public String longestPalindrome(String s) {
int l = 0;
int r = 0;
int max = 0;
for (int i = 0; i < 2 * s.length() - 1; i++) {
int left = i / 2;
int right = left + i % 2;
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
if (right - left > max) {
max = right - left;
l = left;
r = right;
}
left--;
right++;
}
}
return s.substring(l, r + 1);
}
}