kmp算法
Posted barrysgy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kmp算法相关的知识,希望对你有一定的参考价值。
具体参考https://www.cnblogs.com/ciyeer/p/9035072.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);
以上是关于kmp算法的主要内容,如果未能解决你的问题,请参考以下文章