题目链接
LeetCode
题目描述
给你一个字符串 s
,找到 s
中最长的回文子串。
解题思路
方法一:动态规划



class Solution {
public:
string longestPalindrome(string s) {
int len = s.length();
if(len<2)
return s;
int begin = 0;
int maxLen = 1;
vector<vector<bool>> dp(len,vector<bool>(len,false));
for(int i=0;i<len;++i){
dp[i][i] = true;
}
for(int j = 1;j<len;++j){
for(int i = 0;i<j;++i){
if(s[i]==s[j]){
if(j-i<3){
dp[i][j] = true;
}else{
dp[i][j] = dp[i+1][j-1];
}
}
if(dp[i][j]&&j-i+1>maxLen){
maxLen = j-i+1;
begin = i;
}
}
}
return s.substr(begin,maxLen);
}
};
- 时间复杂度 O(n^2)
- 空间复杂度 O(n^2)
方法二:中心扩展算法


class Solution {
public:
string longestPalindrome(string s) {
this->len = s.length();
if(len<2){
return s;
}
str = s;
//最长回文串的长度
int max_len = 0;
//最长回文串的开始位置
int begin = -1;
string res = "";
for(int i = 0;i<len-1;i++){
int tmp = max(expandAround(i,i),expandAround(i,i+1));
if(tmp>max_len){
max_len = tmp;
//计算得出开始位置,maxLen-1可以考虑maxLen为偶数的情况
begin = i - (max_len-1)/2;
}
}
return s.substr(begin,max_len);
}
private:
string str = "";
int len = 0;
int expandAround(int left,int right){
while(left>=0&&right<len){
if(str[left]!=str[right]){
break;
}
left--;
right++;
}
return right-left-1;
}
};