在做最长回文子字符串的问题(第 5 题)的时候, 我用的是 Manacher 算法,按理说应该可以过( O ( n )),但是居然超时了,答案倒是对的, 看了半天也不知道哪里出了问题,求助啊 T^T 。
下面是代码:
public class Solution {
public String longestPalindrome(String s) {
if (s.length() <= 1) {
return s;
}
String newString = addHelperChar(s);
int[] p = new int[newString.length()];
int maxId = 0;
int maxRange = 0;
for (int i = 1; i < newString.length(); i ++) {
p[i] = maxRange > i ? (p[2 * maxId - i] < maxRange - i ? p[2 * maxId - i] : maxRange - i) : 1;
while (i - p[i] > 0
&& i + p[i] < newString.length()
&& newString.charAt(i + p[i]) == newString.charAt(i - p[i])) {
p[i]++;
}
if (maxRange < p[i]) {
maxId = i;
maxRange = p[i];
}
}
String result = "";
for (int i = maxId - maxRange + 1; i < maxId + maxRange; i ++) {
char temp = newString.charAt(i);
if (temp != '#') {
result += temp;
}
}
return result;
}
public String addHelperChar(String s) {
String result = "$";
for (int i = 0; i < s.length(); i ++) {
result += "#";
result += s.charAt(i);
}
result += "#%";
return result;
}
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.