Java实现KMP算法
作者:网络转载 发布时间:[ 2016/2/24 10:18:19 ] 推荐标签:测试开发技术 编程语言
/**
* Java实现KMP算法
*
* 思想:每当一趟匹配过程中出现字符比较不等,不需要回溯i指针,
* 而是利用已经得到的“部分匹配”的结果将模式向右“滑动”尽可能远
* 的一段距离后,继续进行比较。
*
* 时间复杂度O(n+m)
*
*/
public class KMP {
//通过计算返回字串t的next数组
public int[] get_next(char[] t){
int lengthT = t.length;
int[] next = new int[lengthT];
next[0] = -1;
int i = 0;
int j = -1;
while(i < lengthT-1){
//t.charAt(i)表示后缀的单个字符,t.charAt(j)表示前缀的单个字符
if(j == -1 || t[i] == t[j]){
++i;
++j;
next[i] = j;
}else{
//若字符不相同,则j值回溯
j = next[j];
}
}
return next;
}
//改进版求next
public int[] get_nextval(char[] t){
int[] nextval = new int[t.length];
nextval[0] = -1;
int i = 0;
int j = -1;
while(i < t.length - 1){
if(j == -1 || t[i] == t[j]){
++i;
++j;
if(t[i] != t[j]){
nextval[i] = j;
}else{
nextval[i] = nextval[j];
}
}else{
j = nextval[j];
}
}
return nextval;
}
//s是主串,t是子串,匹配成功返回下标,匹配不成功返回-1
public int kmp_Index(char[] s, char[] t){
int[] next = get_nextval(t);
int i = 0;
int j = 0;
while(i <= s.length - 1 && j <= t.length - 1){
if(j == -1 || s[i] == t[j]){
++i;
++j;
}else{
j = next[j];
}
}
if(j < t.length){
return -1;
}else{
return i - t.length;
}
}
public static void main(String[] args) {
KMP kmp = new KMP();
String s = "abbabbbbcab";
String ss = "babbb";
char[] s1 = s.toCharArray();
char[] ss1 = ss.toCharArray();
System.out.println(kmp.kmp_Index(s1, ss1));;
}
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11