チップ
- 使用SUBSTRについて
str.substr(起始下标,截取字符数目);
- 逆に、文字列
string s="abc";
string res(s.rbegin(),s.rend());
- ベクター
vector num(number , initvalue; //初始化
for(int i=0;i<num.size();i++)//size()函数返回的大小不需要+1
cout<<num[i];
基本的な考え方
は逆の順序で文字列の後に2つの最長共通の文字列を求めているが
、しかし、この方法はバグがあります!
試験試料がある場合に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);
}
};