给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
经典动态规划,暴力dp。dp[i][j]=0表示s[i]到s[j]的字串不是回文字串,dp[i][j]=1表示s[i]到s[j]的字串是回文字串,所以可以得到状态转移方程
dp[i][j]=dp[i+1][j-1]&&(s[i]==s[j])
class Solution {
public:
string longestPalindrome(string s) {
int **dp,l=strlen(s.c_str());
dp=(int **)malloc(sizeof(int*)*(l+1));
for(int i=0;i<=l;i++){
dp[i]=(int *)malloc(sizeof(int)*(l+1));
memset(dp[i],0,sizeof(int)*(l+1));
}
for(int i=0;i<l;i++)
dp[i][i]=1;
int max=1,l1=0,r1=0;
for(int i=1;i<l;i++){
for(int j=0;j<l;j++){
if(j+i<l){
if(s[j+i]==s[j]){
if(i==1)dp[j][j+i]=1;
else dp[j][j+i]=dp[j+1][j+i-1];
if(i+1>max&&dp[j][j+i]){
max=i+1;
l1=j;
r1=j+i;
}
}
else dp[j][j+i]=0;
}
}
}
string s1=s.substr(l1,r1-l1+1);
return s1;
}
};
时间复杂度和空间复杂度均为O(),空间爆炸了