题目描述
给你一个字符串s,找到s中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba"同样是符合题意的答案
示例 2:
输入:s = "cbbd"
输出:"bb"
题解
C++
动态规划,时间复杂度 O ( n 2 ) O(n^2) O(n2),空间复杂度 O ( n ) O(n) O(n):
动态规划五步:
- 确定dp数组以及其下标的含义
- 确定递推公式
- 初始化dp数组
- 确定遍历顺序
- 举例推导dp数组
class Solution {
public:
string longestPalindrome(string s) {
vector<vector<bool>> records(s.length(), vector<bool>(s.length(), false));
int max_size = -1;
int left_position;
for (int left = s.length() - 1; left >= 0; --left) {
for (int right = left; right < s.length(); ++right) {
if (s[left] == s[right]) {
if (right - left <= 1) {
records[left][right] = true;
} else if (records[left + 1][right - 1]) {
records[left][right] = true;
}
}
if (records[left][right] && right - left > max_size) {
max_size = right - left;
left_position = left;
}
}
}
return s.substr(left_position, max_size + 1);
}
};
通过双指针从前向后依次统计,时间复杂度 O ( n 2 ) O(n^2) O(n2),空间复杂度 O ( 1 ) O(1) O(1):
class Solution {
public:
/**
* 以s[left]-s[right]为中心向两边对称发散统计回文串数目
* @param s 待处理字符串
* @param left 初始左边界
* @param right 初始右边界
* @param left_position 最长回文子串左边界
* @param max_length 回文子串最大长度
*/
void symmetricallyGrow(const string &s, int left, int right, int &left_position, int &max_length) {
int i = left;
int j = right;
while (i >= 0 && j < s.length() && s[i] == s[j]) {
if (j - i + 1 > max_length) {
max_length = j - i + 1;
left_position = i;
}
--i;
++j;
}
}
string longestPalindrome(string s) {
int max_length = -1;
int left_position;
for (int pivot = 0; pivot < s.length(); ++pivot) {
symmetricallyGrow(s, pivot, pivot, left_position, max_length);
symmetricallyGrow(s, pivot, pivot + 1, left_position, max_length);
}
return s.substr(left_position, max_length);
}
};