|
发表于 2014-7-18 17:47:04
|
显示全部楼层
这是JAVA的实现方法,你看一下:- public class KMP
- {
- public static int[] preProcess(char[] B)
- {
- int size = B.length;
- int[] P = new int[size]; //给模式匹配串添加一个P数组
- P[0] = 0; //也将就是KMP算法中非著名的next数组
- int j = 0; //它指导者模式匹配串下一步改用第几号元素去进行匹配
- for (int i=1; i < size; i++ ) //j为前缀标号 i为后缀标号
- {
- while (j>0 && B[j] != B[i] )
- {
- j = P[j];
- }
- if (B[j] == B[i])
- {
- j++;
- }
- P[i] = j;
- }
- return P;
- }
- public static void kmp(String parStr, String subStr ) //kmp算法的实现
- {
- int subSize = subStr.length(); //子串
- int parSize = parStr.length(); //主串
- char[] B = subStr.toCharArray();
- char[] A = parStr.toCharArray();
- int[] P = preProcess(B);
- int j = 0;
- int k = 0;
- for (int i=0; i < parSize; i++ )
- {
- while (j > 0 && B[j] != A[i] )
- {
- j = P[j-1];
- }
- if (B[j] == A[i])
- {
- j++;
- }
- if (j == subSize)
- {
- j = P[j-1];
- k++;
- System.out.printf("Find subString '%s' at %d\n", subStr, i-subSize+1);
- }
- }
- System.out.printf("Totally found %d times for '%s'.\n\n", k, subStr);
- }
- public static void main(String args[])
- {
- kmp("abcdeg, abcdeh, abcdef!", "abcdef");
- kmp("测试汉字的匹配,小白马","小白马");
- }
- }
复制代码
|
|