Tips
- 关于substr的使用
str.substr(起始下标,截取字符数目);
- 使字符串逆序
string s="abc";
string res(s.rbegin(),s.rend());
- vector
vector num(number , initvalue; //初始化
for(int i=0;i<num.size();i++)//size()函数返回的大小不需要+1
cout<<num[i];
基本思路
将字符串逆序之后求两个字符串的最长公共子串
但是这个方法存在bug!
当测试样例为aacdefcaa
时就会出错
因此需要对于每一个找到的最长公共子串通过它的逆序与它是否相等测试出是否为回文串。
在求最长公共子串中选用了动态规划,f[i][j]表示从s[i]这个字符往后看str中有多少个重复的字符
。
显然这个方法比较麻烦…因此最后的效果较为一般。
class Solution {
public:
string longestPalindrome(string s) {
string str(s.rbegin(),s.rend());
if(s==str)return s;
return longestsame(s,str);
}
string longestsame(string s,string str)
{
string temp;
int index=0;
int mm=0;
int f[s.length()][str.length()];
for(int i=0;i<s.length();i++)
{
for(int j=0;j<s.length();j++)
{
f[i][j]=0;
}
}
for(int i=s.length()-1;i>=0;i--)
{
for(int j=s.length()-1;j>=0;j--)
{
if(s[i]==str[j])
{
if(i!=s.length()-1&&j!=s.length()-1)
{
f[i][j]=f[i+1][j+1]+1;
}
else
f[i][j]=1;
if(mm<f[i][j])
{
temp=s.substr(i,f[i][j]);
string test(temp.rbegin(),temp.rend());
if(temp==test)
{
mm=f[i][j];
index=i;
}
}
}
else f[i][j]=0;
}
}
return s.substr(index,mm);
}
};