33,010
社区成员
发帖
与我相关
我的任务
分享
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;
}
}
for(int i = 0; i < s.length(); i++)
{
T = T + s.charAt(i) + "#";
}
对于java而言,字符串的累加会导致不断的创建新的字符串对象,以及随之了来的内存copy动作,恐怕会比较费时间