manacher算法实现
2015-10-11 21:48
260 查看
if (str == null || str.length() == 0) {
return 0;
}
char[] charArr = manacherString(str);
int[] pArr = new int[charArr.length];
int index = -1;
int pR = -1;
int max = Integer.MIN_VALUE;
for (int i = 0; i != charArr.length; i++) {
pArr[i] = pR > i ? Math.min(pArr[2 * index - i], pR - i) : 1; //初始化 这里可以再优化 取最小的可能会增加次数
while (i + pArr[i] < charArr.length && i - pArr[i] > -1) { //是否越界
if (charArr[i + pArr[i]] == charArr[i - pArr[i]])
pArr[i]++;
else {
break;
}
}
if (i + pArr[i] > pR) {
pR = i + pArr[i];
index = i;
}
max = Math.max(max, pArr[i]); //这个数组可以变成一个map 这样不仅可以求出子串长度 还可以求出子串
}
return max - 1;
预处理串
public char[] manacherString(String str) {
char[] charArr = str.toCharArray();
char[] res = new char[str.length() * 2 + 1];
int index = 0;
for (int i = 0; i != res.length; i++) {
res[i] = (i & 1) == 0 ? '#' : charArr[index++];
}
return res;
}
return 0;
}
char[] charArr = manacherString(str);
int[] pArr = new int[charArr.length];
int index = -1;
int pR = -1;
int max = Integer.MIN_VALUE;
for (int i = 0; i != charArr.length; i++) {
pArr[i] = pR > i ? Math.min(pArr[2 * index - i], pR - i) : 1; //初始化 这里可以再优化 取最小的可能会增加次数
while (i + pArr[i] < charArr.length && i - pArr[i] > -1) { //是否越界
if (charArr[i + pArr[i]] == charArr[i - pArr[i]])
pArr[i]++;
else {
break;
}
}
if (i + pArr[i] > pR) {
pR = i + pArr[i];
index = i;
}
max = Math.max(max, pArr[i]); //这个数组可以变成一个map 这样不仅可以求出子串长度 还可以求出子串
}
return max - 1;
预处理串
public char[] manacherString(String str) {
char[] charArr = str.toCharArray();
char[] res = new char[str.length() * 2 + 1];
int index = 0;
for (int i = 0; i != res.length; i++) {
res[i] = (i & 1) == 0 ? '#' : charArr[index++];
}
return res;
}
相关文章推荐
- linux下的软件管理(yum仓库)
- STM32输出2路PWM-------------------------------major
- C/C++基础总结(一)
- 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-02-Example
- 面试,一点小心得
- CodeForces 128D Numbers [想法题/贪心]
- AngularJS学习总结
- php的几种标记
- 最长上升子序列 O(nlogn)解法 (转)
- 15、Hibernate的原生sql查询,优化Hibernate的查询效率
- 产品UI设计排版的四个基本原则
- js typeof instanceof
- XAMMP Port 443 in use by
- hdu 5480 Conturbatio(水)
- 系统开发技术栈
- 博弈论学习小结及博文推荐
- Oracle Flashback技术之Flashback Table
- EventBus(2)——源码解析
- EventBus(1)——基本使用
- 【Python】if语句使用规则