最长回文子串
难度:
标签:
题目描述
给你一个字符串 s
,找到 s
中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd" 输出:"bb"
提示:
1 <= s.length <= 1000
s
仅由数字和英文字母组成
代码结果
运行时间: 1000 ms, 内存: 15 MB
/**
* This solution utilizes Java Stream API to find the longest palindromic substring.
* However, due to the functional nature of streams, dynamic programming table implementation is less straightforward.
* We implement a similar solution but in a more functional style where possible.
*/
import java.util.stream.IntStream;
public class SolutionStream {
public String longestPalindrome(String s) {
int n = s.length();
if (n <= 1) return s;
boolean[][] dp = new boolean[n][n];
int[] maxLenStart = {1, 0}; // maxLen, start
IntStream.range(0, n).forEach(i -> dp[i][i] = true);
IntStream.range(0, n - 1).filter(i -> s.charAt(i) == s.charAt(i + 1)).forEach(i -> {
dp[i][i + 1] = true;
maxLenStart[0] = 2;
maxLenStart[1] = i;
});
IntStream.range(3, n + 1).forEach(len ->
IntStream.range(0, n - len + 1).forEach(i -> {
int j = i + len - 1;
if (s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1]) {
dp[i][j] = true;
maxLenStart[0] = len;
maxLenStart[1] = i;
}
})
);
return s.substring(maxLenStart[1], maxLenStart[1] + maxLenStart[0]);
}
}
解释
方法:
这个题解使用了中心扩展法来寻找最长回文子串。对于字符串中的每个位置,以该位置为中心,向两边扩展,找到以该位置为中心的最长回文子串。需要考虑回文子串长度为奇数和偶数两种情况。最后返回所有找到的回文子串中最长的一个。
时间复杂度:
O(n^2)
空间复杂度:
O(1)
代码细节讲解
🦆
为什么中心扩展法是解决这个问题的合适方法,与动态规划或其他字符串搜索算法相比有何优势?
▷🦆
在扩展过程中,如果字符序列长度为偶数,如何选择中心点来确保不遗漏任何可能的回文子串?
▷🦆
扩展函数在检测到不匹配字符时立即停止,这是否意味着总是返回正确的回文长度,还是可能存在需要调整的边界情况?
▷🦆
为什么在寻找最长回文子串时需要单独处理奇数和偶数长度的情况,不能统一处理?
▷相关问题
最短回文串
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。
示例 1:
输入:s = "aacecaaa" 输出:"aaacecaaa"
示例 2:
输入:s = "abcd" 输出:"dcbabcd"
提示:
0 <= s.length <= 5 * 104
s
仅由小写英文字母组成
回文对
给定一个由唯一字符串构成的 0 索引 数组 words
。
回文对 是一对整数 (i, j)
,满足以下条件:
0 <= i, j < words.length
,i != j
,并且words[i] + words[j]
(两个字符串的连接)是一个回文串。
返回一个数组,它包含 words
中所有满足 回文对 条件的字符串。
你必须设计一个时间复杂度为 O(sum of words[i].length)
的算法。
示例 1:
输入:words = ["abcd","dcba","lls","s","sssll"]
输出:[[0,1],[1,0],[3,2],[2,4]]
解释:可拼接成的回文串为 ["dcbaabcd","abcddcba","slls","llssssll"]
示例 2:
输入:words = ["bat","tab","cat"]
输出:[[0,1],[1,0]]
解释:可拼接成的回文串为 ["battab","tabbat"]
示例 3:
输入:words = ["a",""] 输出:[[0,1],[1,0]]
提示:
1 <= words.length <= 5000
0 <= words[i].length <= 300
words[i]
由小写英文字母组成