1 题目
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2 Java
2.1 方法一(中心扩展,思维)
class Solution {
public String longestPalindrome(String s) {
int N = s.length();
String sAns = "";
for(int i = 0; i <= 2 * N - 2; i++){
int l = i / 2, r = l + i % 2;
while(l >= 0 && r < N && s.charAt(l) == s.charAt(r)){
l--; r++;
}
// 记录最长回文串;也是唯一添加的步骤
if(sAns.length() < r - l - 1) sAns = s.substring(l + 1, r);
}
return sAns;
}
}
StringBuilder优化
class Solution {
public String longestPalindrome(String s) {
int N = s.length();
StringBuilder sAns = new StringBuilder();
for(int i = 0; i <= 2 * N - 2; i++){
int l = i / 2, r = l + i % 2;
while(l >= 0 && r < N && s.charAt(l) == s.charAt(r)){
l--; r++;
}
// 记录最长回文串
if(sAns.length() < r - l - 1) sAns = new StringBuilder(s.substring(l + 1, r));
}
return sAns.toString();
}
}
或者
class Solution {
public String longestPalindrome(String s) {
int N = s.length();
StringBuilder sAns = new StringBuilder();
for(int i = 0; i <= 2 * N - 2; i++){
int l = i / 2, r = l + i % 2;
while(l >= 0 && r < N && s.charAt(l) == s.charAt(r)){
l--; r++;
}
// 记录最长回文串
if(sAns.length() < r - l - 1){
sAns.setLength(0);
sAns.append(s.substring(l + 1, r));
}
}
return sAns.toString();
}
}
2.2 方法二(动归乱序迭代)
class Solution {
public String longestPalindrome(String s) {
int N = s.length();
StringBuilder sAns = new StringBuilder();
boolean[][] dp = new boolean[N][N];
// 乱序步进;i不断减,j不断加,同时i的范围又由j决定,所以j在外层
for(int j = 0; j < N; j++){
for(int i = j; i >= 0; i--){
if(s.charAt(i) == s.charAt(j) && (j - i <= 1 || dp[i + 1][j - 1])){
dp[i][j] = true;
// 记录最长回文串
if(sAns.length() < j - i + 1){
sAns.setLength(0);
sAns.append(s.substring(i, j + 1));
}
}
}
}
return sAns.toString();
}
}