- 思路:一个子串是否为回文串可以判断这个子串的第一个与最后一个是否相等+中间的子串是否为回文,中间的子串又可以分解为第一个与最后一个是否相等+中间的子串是否为回文,所以我们就找到了最优子结构,我们直接贴代码来分析
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <unordered_map>
using namespace std;
bool cmp(string a,string b)
{
return a+b<b+a;
}
//最长回文子串
string longestPalindrome(string s)
{
if(s.size()==0) return s;
int n=s.size();
vector<vector<int> > dp(n,vector<int>(n));
string ret="";
int max=0;
for(int i=0;i<n;i++){
//这个双循环是在判断j到i位置的子串是否为回文串
for(int j=0;j<=i;j++){
//i-j <=2这句是因为如果子串为bb时就是极限状态,他也构成回文
//dp[i-1][j+1]这句就是判断中间的子串是否为回文,很好理解
dp[i][j]=((s[i]==s[j])&&((i-j<=2)||dp[i-1][j+1]));
if(dp[i][j]==max){
max=i-j+1;
ret=s.substr(j,i-j+1);
}
}
}
return ret;
}
int main()
{
string str;
string res="";
getline(cin,str);
res=longestPalindrome(str);
cout<<res<<endl;
// cout<<endl;
return 0;
}