kmp算法

代码
1 /*
2 功能: KMP算法的C语言实现
3 author: glq2000[glq2000@126.com]
4 Date: Tus, 2010-8-10
5
6 Note: 看严蔚敏那本书的关于KMP的讲解时,next()函数始终不太明白,知道后来读到了
7 大牛matrix67写的一篇博文《KMP算法详解》,才彻底搞懂这个"看毛片"(KMP)算法,
8 mantrix67的原文中用的passical实现的,我将其改为了C语言
9 原文链接: http://www.matrix67.com/blog/archives/115
10  */
11 #include <stdio.h>
12 #include <string.h>
13
14  char a[] = "abababaababacb";
15  char b[] = "ababacb";
16
17 //P[0]不使用,P[i]表示B串的前i个字符中, 前P[i]个字符和后P[i]个字符相同
18 int P[7];//尽管strlen(b)为7,但P[7]用不到,只用P[1]到P[6]
19
20 char* KMP(char* A, char* B); //返回B串在A串中的位置 B串:模式串 A串:待匹配串
21 void InitP(char *B); //将B串(模式串)进行自我匹配
22
23 int main()
24 {
25 InitP(b);
26 char *idx = KMP(a, b);
27 if(!idx)
28 puts("b is not a's substring.");
29 else
30 printf("b is a's substring, the index is %d\n",idx-a);
31
32 getchar();
33 return 0;
34 }
35
36
37 char* KMP(char *A, char *B)
38 {
39 int len1=strlen(A), len2=strlen(B);
40 int i, j=0; //j代表目前B串中已与A串匹配了的字符的个数
41 for(i=0; i<len1; ++i)
42 {
43 while(j>0 && A[i]!=B[j]) //0...j-1,已匹配了j个字符,sub[j]是sub的第j+1的字符,因为下标从0开始
44 j = P[j];
45
46 if(A[i] == B[j])
47 ++j;
48 if(j == len2) //当j(B中已匹配了的字符串的个数)与B串本身长度相等时,说明匹配完毕
49 return A+i-j+1; //此时可计算出指针位置
50 }
51 return NULL;
52 }
53
54
55 /*****************************************************************************
56 初始化数组P[7],P[i]表示B串的前i个字符中, 前P[i]个字符和后P[i]个字符相同
57 比如:
58 char b[] = "ababacb";
59 p[1]=0
60 P[2]=0, 因为字符串b[]的前2个字符"ab"不符合条件.
61 P[3]=1, 因为字符串b[]的前3个字符"aba",其第一个字符和最后一个字符相同
62 P[4]=2, 因为字符串b[]的前4个字符"abab",其前两个字符和后两个字符相同
63 P[5]=3, 因为字符串b[]的前5个字符"ababa",其前3个字符和后3个字符相同,都是aba
64 P[6]=0
65
66 函数InitP(char *B)的任务就是根据B串初始化数组P,这其实就是一个对B串进行自我匹配
67 的过程,与上面的KMP(char *A, char *B)函数很像.
68 *******************************************************************************/
69 void InitP(char *B)
70 {
71 P[0] = 0;
72 P[1] = 0;
73 int i, j=0, len=strlen(B);
74 for(i=2; i<len; ++i)
75 {
76 /*while(j>0 && B[j]!=B[i-1]), 这里的j代表
77 在比较第i个字符(从1开始数)和B[j]时,前i-1个字符中的前j个字符和后j的字符相同
78 B[j]代表第j的字符(从1开始数)的下一个字符*/
79 while(j>0 && B[j]!=B[i-1]) //如果第i个字符和第j个字符的下一个字符(即B[j])不同,则改变j的值,再重新比较
80 j = P[j];
81 if(B[j] == B[i-1])
82 ++j;
83 P[i] = j;
84 }
85 }

 

posted on 2010-11-05 08:20  光与影的交替  阅读(252)  评论(0编辑  收藏  举报

导航