5. 最长回文子串
weiwi大佬题解
给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
中心扩散法
学到的经验:
- 合适的数据结构存储返回结果很重要:用一个俩元素的vector接收起始下标和长度;
- 看的Java题解,有个bug半天没看出来,原来是字符串的库函数不同:substr。。。
class Solution {
public:
string longestPalindrome(string s) {
if(s.size() < 2) return s;
int maxLen = 0;
// 数组第一位记录起始位置,第二位记录长度
vector<int> res(2);
for(int i = 0; i < s.size() - 1; i++){
vector<int> odd = extend(i, i, s);
vector<int> even = extend(i, i + 1, s);
vector<int> max = odd[1] > even[1] ? odd : even;
if(maxLen < max[1]){
res = max;
maxLen = max[1];
}
}
return s.substr(res[0], res[1]);
}
vector<int> extend(int i, int j, string s){
while(i >= 0 && j < s.size() && s[i] == s[j]){
i--;
j++;
}
return vector<int>{i + 1, j - i - 1};
}
};
动态规划
class Solution {
public:
string longestPalindrome(string s) {
int begin = 0, maxlen = 1;
vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));
for(int i = s.size() - 1; i >= 0; i--){
for(int j = i; j < s.size(); j++){
if(s[i] == s[j]){
if(j - i <= 1) dp[i][j] = true;
else if(dp[i + 1][j - 1])
dp[i][j] = true;
}
if(dp[i][j] && maxlen < j - i + 1){
begin = i;
maxlen = j - i + 1;
}
}
}
return s.substr(begin, maxlen);
}
};