C语言数据结构中串的模式匹配
串的模式匹配问题:朴素算法与KMP算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
#include<stdio.h> #include<string.h> int Index( char *S, char *T, int pos){ //返回字串T在主串S中第pos个字符之后的位置。若不存在,则函数值为0. //其中,T非空,1<=pos<=StrLength(s). int i=pos; int j=1; while (i<=S[0]&&j<=T[0]){ if (S[i]==T[j]){++i;++j;} else {i=i-j+2;j=1;} } if (j>T[0]) return i-T[0]; else return 0; } int get_next( char *T, int next[]){ //求模式串T的next函数值并存入数组next。 int i=1;next[1]=0; int j=0; while (i<T[0]){ if (j==0||T[i]==T[j]){++i;++j;next[i]=j;} else j=next[j]; } return *next; } int Index_KMP( char *S, char *T, int pos){ //利用模式串T的next函数求T在主串S中第pos个字符之后的位置的KMP算法,其中T非空,1<=pos<=StrLength(S). int next[100]; *next=get_next(T,next); int j=1,i=pos; while (i<=S[0]&&j<=T[0]){ if (j==0||S[i]==T[j]){++i;++j;} else j=next[j]; } if (j>T[0]) return i-T[0]; else return 0; } void main() { int id,j,k,i,a; printf ( "输入主串、子串和匹配起始位置\n" ); char A[20]; char B[10]; printf ( "请输入主字串内容\n" ); gets (A+1); *A= strlen (A+1); printf ( "请输入子字串内容\n" ); gets (B+1); *B= strlen (B+1); printf ( "请输匹配起始位置\n" ); scanf ( "%d" ,&j); //printf("%d ",k); do { printf ( "\n请输入您需要的任务的序号" ); printf ( "\n1:朴素的模式匹配算法" ); printf ( "\n2:快速模式匹配算法" ); printf ( "\n3:退出\n" ); scanf ( "%d" ,&id); switch (id){ case 1: { printf ( "\n\n你调用了功能1:" ); printf ( "\n朴素的模式匹配算法" ); k=Index(A,B,j); printf ( "\n该位置为:" ); printf ( "%d\n" ,k); break ;} case 2: { printf ( "\n\n你调用了功能2:" ); printf ( "\n 快速模式匹配算法" ); a=Index_KMP(A,B,j); printf ( "\n该位置为:" ); printf ( "%d\n" ,a); break ;} case 3: { printf ( "\n\n你调用了功能3:" ); printf ( "\n退出\n" ); } } } while (id!=3); |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
#include<stdio.h> #include<string.h> int Index( char *S, char *T, int pos){ //返回字串T在主串S中第pos个字符之后的位置。若不存在,则函数值为0. //其中,T非空,1<=pos<=StrLength(s). int i=pos; int j=1; while (i<=S[0]&&j<=T[0]){ if (S[i]==T[j]){++i;++j;} else {i=i-j+2;j=1;} } if (j>T[0]) return i-T[0]; else return 0; } int get_next( char *T, int next[]){ //求模式串T的next函数值并存入数组next。 int i=1;next[1]=0; int j=0; while (i<T[0]){ if (j==0||T[i]==T[j]){++i;++j;next[i]=j;} else j=next[j]; } return *next; } int Index_KMP( char *S, char *T, int pos){ //利用模式串T的next函数求T在主串S中第pos个字符之后的位置的KMP算法,其中T非空,1<=pos<=StrLength(S). int next[100]; *next=get_next(T,next); int j=1,i=pos; while (i<=S[0]&&j<=T[0]){ if (j==0||S[i]==T[j]){++i;++j;} else j=next[j]; } if (j>T[0]) return i-T[0]; else return 0; } void main() { int id,j,k,i,a; printf ( "输入主串、子串和匹配起始位置\n" ); char A[20]; char B[10]; printf ( "请输入主字串内容\n" ); gets (A+1); *A= strlen (A+1); printf ( "请输入子字串内容\n" ); gets (B+1); *B= strlen (B+1); printf ( "请输匹配起始位置\n" ); scanf ( "%d" ,&j); //printf("%d ",k); do { printf ( "\n请输入您需要的任务的序号" ); printf ( "\n1:朴素的模式匹配算法" ); printf ( "\n2:快速模式匹配算法" ); printf ( "\n3:退出\n" ); scanf ( "%d" ,&id); switch (id){ case 1: { printf ( "\n\n你调用了功能1:" ); printf ( "\n朴素的模式匹配算法" ); k=Index(A,B,j); printf ( "\n该位置为:" ); printf ( "%d\n" ,k); break ;} case 2: { printf ( "\n\n你调用了功能2:" ); printf ( "\n 快速模式匹配算法" ); a=Index_KMP(A,B,j); printf ( "\n该位置为:" ); printf ( "%d\n" ,a); break ;} case 3: { printf ( "\n\n你调用了功能3:" ); printf ( "\n退出\n" ); } } } while (id!=3); } |
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!