//最长回转子串
//先用的DP,居然不给力,TLE了,可能算法有一些冗余
class Solution {
public:
string longestPalindrome(string s) {
size_t len = s.length();
//bool yang[len][len];
bool **yang = new bool*[len];
for (int i = 0; i < len; ++i)
yang[i] = new bool[len];
int startpos=0;
int res=1;
for(int i=0;i<len;i++)
{
yang[i][i]=true;
if(i+1<len)
if(s[i]==s[i+1])
{
yang[i][i+1]=true;
startpos=i;
res=2;
}
//test line
else yang[i][i+1] = false;
}
for(int j=3;j<=len;j++)
{
for(int i=0;i<len-j+1;i++)
{
int t=i+j-1;
if(yang[i+1][t-1]&&s[i]==s[t])
{
yang[i][t]=true;
if(res<t-i+1)
{
startpos=i;
res=t-i+1;
}
}
}
}
for (int i = 0; i < len; ++i)
delete[] yang[i];
delete[] yang;
return s.substr(startpos,res);
}
};
//然后看到一种算法,中心扩展法,从中间往两边扩延看最长回转子串
class Solution {
public:
string longestPalindrome(string s) {
int len=s.length();
int startpos=0;
int res=1;
int tmp=1;
for(int i=0;i<len;i++)
{
int oddlen=1;
int evenlen=0;
oddlen=calculate(s,i,i);
if(i+1<len)
evenlen=calculate(s,i,i+1);
tmp=max(oddlen,evenlen);
if(res<tmp)
{
startpos=i-(tmp-1)/2;
res=tmp;
}
}
return s.substr(startpos,res);
}
int calculate(string &s,int ss,int tt)
{
int temp=1;
int n=s.length();
int i,j;
for(i=ss,j=tt;i>=0&&j<n;i--,j++)
{
if(s[i]==s[j])
continue;
else
break;
}
return (j-1)-(i+1)+1;
}
};
本文介绍了两种寻找字符串中最长回文子串的方法:动态规划法和中心扩展法,并提供了详细的算法实现步骤。
596

被折叠的 条评论
为什么被折叠?



