leetcode上用java实现Manacher's Algorithm(马拉车算法),效果很差,求神帮我看看哪里出了问题

tbssl 2017-09-12 11:57:59
class Solution {
public static String longestPalindrome(String s) {
//用马拉车算法
String T = "#";
int P = 0;
int P0 = 0;
int maxlen = 0;

//每个字符中间插入符号
for(int i = 0; i < s.length(); i++)
{
T = T + s.charAt(i) + "#";
}
int[] len = new int[T.length()];

for(int i = 1; i < T.length()-1; i++)
{
//如果i在P和P0中间则利用已计算完毕的len[j]
if(P0 < i && i < P)
{
int j = P0 - (i - P0);

//如果len[i]的右界没有超过P
if(len[j] < P-i)
{
len[i] = len[j];
}
//如果len[i]的右界超过P了。就从P开始判断是否回文
else if(i+len[j] >= P)
{
len[i] = (P - i - 1);
len[i] = comp(i,len[i],T);
}
}
//如果i在P外则老老实实匹配
else if(i >= P)
{
len[i] = comp(i,len[i],T);
}
//更新P
if(len[i]+i-1 > P)
{
P = len[i] + i-1;
P0 = i;
}
}

int k = 0;
//找到长度最长 的中点及长度
for(int j= 0; j < len.length; j++)
{
if(len[j] > maxlen)
{
maxlen = len[j];
k = j;
}
}

//返回字串
String ans = s.substring((k-maxlen+1)/2, (k-maxlen+1)/2+maxlen-1);

return ans;
}
private static int comp(int i,int len, String T) //判断是否回文
{
while((i+len+1 < T.length()) && (i-len-1 >= 0) && (T.charAt(i+len+1) == T.charAt(i-len-1)))
{
len ++;
}
return ++len;
}
}


算法参考自http://blog.csdn.net/dyx404514/article/details/42061017

现在遇到的问题是在leetcode上我的代码速度只超过了20%的人,不是说马拉车算法是找回文字串效果最好的么。是我代码哪里出问题了?
...全文
515 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyfhz 2017-09-13
  • 打赏
  • 举报
回复
假设你的算法没有问题的话,或许下面的代码会比较浪费时间

        for(int i = 0; i < s.length(); i++)
        {
            T = T + s.charAt(i) + "#";
        }
对于java而言,字符串的累加会导致不断的创建新的字符串对象,以及随之了来的内存copy动作,恐怕会比较费时间

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧