kmp算法
2020-12-13 14:02
标签:else html 快速 tps 移动 make pat print 跳转 具体参考https://www.cnblogs.com/ciyeer/p/9035072.html kmp算法 标签:else html 快速 tps 移动 make pat print 跳转 原文地址:https://www.cnblogs.com/barrysgy/p/11550134.html/**
* 创建next数组(数组第0位没作用, 从第1位才是有效位)
* @param pattern
* @return
*/
static int[] makeNext(String pattern)
{
char[] chars = pattern.toCharArray();
int[] next = new int[chars.length + 1];
int i = 1;
next[1] = 0;
int j = 0;
while (i chars.length)
{
if (j == 0 || chars[i-1] == chars[j-1])
{
i++;
j++;
next[i] = j;
}
else
{
j = next[j];
}
}
return next;
}
/**
* kmp方法查询字符串(快速模式匹配算法)
* 源字符串中的索引i不会回溯, 比对字符串时
* 找到不一样的, 移动模式串的索引j来与源串中i位置再继续比较
* @param src
* @param pattern
* @return
*/
public static int kmpFindStr(String src, String pattern) {
int[] next = makeNext(pattern);
char[] s = src.toCharArray();
char[] t = pattern.toCharArray();
//j为模串的索
int j = 0;
//i为源字符串的索引
for(int i = 0; i s.length;) {
if(j == 0 || t[j] == s[i]) {
i++;
j++;
if(j >= t.length) {
//找到了
return i - j;
}
}
else {
//两个值不一样, 修改j的跳转位置
j = next[j];
}
}
return -1;
}
/**
* 测试
*
* @param args
*/
public static void main(String[] args) {
int index = kmpFindStr("abf55abaabaca11", "abaabaca");
System.out.print(index);
}