【字符串匹配】KMP算法
目录
1.KMP的名词解释
2.KMP运行原理
3.KMP的代码
1.KMP的名词解释
KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。
具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。
2.KMP运行原理
next数组怎么求?
对模式串p求next数组,next数组的值为模式串p的该位置失配,下一步j从哪个位置回溯。
理解:若j位置失配,则在p[0,j-1]中查找前缀,后缀中最长匹配距离。
如何使用代码实现?
主要是找到失配位置j的最长匹配前缀在哪里
使得next[j]=k k为j下次应该回溯的位置,
比较p[j]、p[k],如果两字符相等 k++;j++;
如果不等j回溯到k,直到k<0
3.KMP的代码
public class ccase12_KMP { public static void main(String[] args) { String s = "babababcbabababb"; // String p="bababb"; String p = "bab"; System.out.println(work(s, p)); } /** * 求出现模式串的次数 * * @param s * @param p */ private static int work(String s, String p) { int len1 = s.length(); int len2 = p.length(); int i = 0, j = 0; int count = 0; int[] next = next(p); // 异常处理 if (len1 < len2) return -1; if (len1 == 0 || len2 == 0) return -1; while (i < len1) { if (j == -1 || s.charAt(i) == p.charAt(j)) { i++; j++; } else {// 失配 j = next[j]; } if (j == len2) { count++; i--; j = next[j]; // return (i-j); } } return count; } public static int[] next(String p1) { int[] next = new int[p1.length() + 1]; char[] p = p1.toCharArray(); next[0] = -1; if (p1.length() == 1) return next; next[1] = 0; int j = 1; int k = next[j]; while (j < p1.length()) { if (k < 0 || p[j] == p[k]) { next[++j] = ++k; } else { k = next[k]; } } return next; } }
浙公网安备 33010602011771号