力扣 5 longest-palindromic-substring 最长回文子串
题目
给你一个字符串 s,找到 s 中最长的回文子串。
最长回文子串
题解
dp[i][j] 代表从第i个位置到第j个位置是否为回文。
转移方程为:dp[i][j] = dp[i+1][j-1]&&(s[i]==s[j])
意思就是要判断当前的串是否回文,如果知道去掉头尾后是否回文在判断头尾是否相同就可以了。
代码
int dp[1005][1005];
class Solution {
public:
string longestPalindrome(string s) {
//初始化
int maxx=0;
int beg=0;
string ans="";
if(s.size()==0){
return ans;
}
memset(dp,-1,sizeof(dp));
for(int i=0;i<s.size();i++){
dp[i][1]=1;
dp[i][0]=0;
if(dp[i][1]>maxx){
maxx=dp[i][1];
ans = ans+s[i];
}
}
for(int j=2;j<=s.size();j++){ //长度
for(int i=0;i<s.size();i++){ //起始点
// cout<<i+1<<",,"<<j-1<<" "<<dp[i+1][j-1]<<" "<<" "<<i<<" "<<j<<" "<<s[i]<<" "<<s[i+j]<<" "<<s<<endl;
if((dp[i+1][j-2]!=-1) && (s[i]==s[i+j-1])){
dp[i][j]=dp[i+1][j-2]+2;
//cout<<i<<" "<<j<<endl;
if(dp[i][j]>maxx){
maxx= dp[i][j];
beg=i;
}
}
//dp[j][i]=max(dp[i][j],)
}
}
if(maxx>1){
ans = "";
for(int i=1;i<=maxx;i++){
ans = ans+s[beg+i-1];
}
}
return ans;
}
};