LeetCode 5
https://leetcode.cn/problems/longest-palindromic-substring/description/
难度:中等
本题是字符串的经典题目,有 3 种做法,分别是动态规划,中心扩展法和马拉车算法。其中前两种做法的时间复杂度为\(O(n^2)\),马拉车算法的时间复杂度为\(O(n)\)。不过由于马拉车算法较为复杂,在这里使用的是实现较为简单的中心扩展算法。
中心扩展算法就是对于每一个元素,分别讨论子串长度为奇数和偶数的情况,如果子串两端的字符相同,就继续向外扩展。
时间复杂度:\(O(n^2)\),其中 n 是字符串的长度。长度为 1 和 2 的回文中心分别有 n 和 n−1 个,每个回文中心最多会向外扩展 O(n) 次。
空间复杂度:O(1)。
class Solution {
public:
string longestPalindrome(string s) {
int start = -1, len = 0;
int n = s.size();
for (int i = 0; i < n; i++) {
int r = 0;
while (i - r >= 0 && i + r < n && s[i - r] == s[i + r]) {
r++;
}
r--;
if (2 * r + 1 > len) {
len = 2 * r + 1;
start = i - r;
}
if (i < n - 1) {
r = 0;
while (i - r >= 0 && i + 1 + r < n && s[i - r] == s[i + 1 + r]) {
r++;
}
r--;
if (2 * r + 2 > len) {
len = 2 * r + 2;
start = i - r;
}
}
}
return s.substr(start, len);
}
};