方法一、反转字符串,找最长公共子串
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
string longestPalindrome(string s)
{
string res=s;
reverse(res.begin(),res.end());
if(res==s)
{
return s;
}
int len=s.size();
string temp="";
string result;
// string tem;
int l=0;
for(int i=0;i<len;i++)
{
temp="";
//string temp;
for(int j=i;j<len;j++)
{
temp =temp+s[j];
if(l<temp.size())
{
if(res.find(temp)!=-1)
{
string tem=temp;
reverse(tem.begin(),tem.end());
if(tem==temp)
{
l=tem.size();
result=tem;
}
}
else
{
break;
}
}
else
{
continue;
}
}
// temp="";
}
return result;
}
};
方法二、
用动态规划
先将res[i][i]标记为1,
在考虑两个一组的,再考虑三个一组的。。。一直到s.length一组的
返回的是s中以start开始,max长度的子串。
class Solution {
public:
string longestPalindrome(string s)
{
int len=s.size();
if(len==0||len==1)
{
return s;
}
vector<vector<int> >res(len,vector<int>(len));
int start=0;
int max=1;
for(int i=0;i<len;i++)
{
res[i][i]=1;
if(s[i]==s[i+1])
{
res[i][i+1]=1;
max=2;
start=i;
}
}
for(int l=3;l<=len;l++)
{
for(int k=0;k+l-1<len;k++)
{
int j=k+l-1;
if(s[k]==s[j]&&res[k+1][j-1]==1)
{
res[k][j]=1;
max=l;
start=k;
}
}
}
return s.substr(start,max);
}
};