一、实现主要功能为:
1、输入模式串、目标串
2、根据目标串生成next[]和nextval[]数组
3、根据next[]或者nextval[]进行匹配。
二、程序截图:
三、代码:
1 #include <iostream>
2 #include <stdio.h>
3 #include <string.h>
4 #include <stdlib.h>
5 using namespace std;
6
7 #define MAXSIZE 1000 //最大字符数
8
9 struct SqString{ //定义顺序串结构
10 char data[MAXSIZE];
11 int length;
12 };
13
14 void GetNext(SqString t,int next[]) //求出模式串t的next数组
15 {
16 int j,k;
17 j=0,k=-1;next[0] = -1;
18 while(j<t.length-1){
19 if(k==-1 || t.data[j]==t.data[k]){
20 j++,k++;
21 next[j] = k;
22 }
23 else
24 k = next[k];
25 }
26 }
27
28 void GetNextval(SqString t,int nextval[]) //求出模式串t的valnext数组
29 {
30 int j,k;
31 j=0,k=-1;nextval[0]=-1;
32 while(j<t.length){
33 if(k==-1 || t.data[j]==t.data[k]){
34 j++;k++;
35 if(t.data[j]!=t.data[k])
36 nextval[j] = k;
37 else
38 nextval[j] = nextval[k];
39 }
40 else
41 k = nextval[k];
42 }
43 }
44
45 void printNext(SqString t,int next[]) //输出next数组
46 {
47 int i=0;
48 while(i<t.length){ //分段输出,每段8个数据
49 int j=i;
50 printf("j ");
51 printf("%d ",i++);
52 for(;i<t.length && i%8;i++){ //输出j
53 printf("%d ",i);
54 }
55 printf("
");
56 printf("next[j] ");
57 i=j;
58 printf("%d ",next[i++]);
59 for(;i<t.length && i%8;i++){ //输出next[j]
60 printf("%d ",next[i]);
61 }
62 printf("
");
63 }
64 }
65
66 void printNextval(SqString t,int nextval[]) //输出nextval数组
67 {
68 int i=0;
69 while(i<t.length){ //分段输出,每段7个数据
70 int j=i;
71 printf("j ");
72 printf("%d ",i++);
73 for(;i<t.length && i%7;i++){ //输出j
74 printf("%d ",i);
75 }
76 printf("
");
77 printf("nextval[j] ");
78 i=j;
79 printf("%d ",nextval[i++]);
80 for(;i<t.length && i%7;i++){ //输出next[j]
81 printf("%d ",nextval[i]);
82 }
83 printf("
");
84 }
85 }
86
87 int KMPIndex1(SqString s,SqString t,int next[])
88 {
89 int i=0,j=0;
90 while(i<s.length && j<t.length){
91 if(j==-1 || s.data[i]==t.data[j])
92 i++,j++;
93 else
94 j=next[j];
95 }
96 if(j>=t.length)
97 return i-t.length;
98 else
99 return -1;
100 }
101
102 int KMPIndex2(SqString s,SqString t,int nextval[])
103 {
104 int i=0,j=0;
105 while(i<s.length && j<t.length){
106 if(j==-1 || s.data[i]==t.data[j])
107 i++,j++;
108 else
109 j = nextval[j];
110 }
111 if(j>=t.length)
112 return i-t.length;
113 else
114 return -1;
115 }
116
117 int Menu() //操作菜单
118 {
119 int in;
120 printf("[1] 输入目标串
");
121 printf("[2] 输入模式串
");
122 printf("[3] 输出模式串的next数组
");
123 printf("[4] 输出模式串的nextval数组
");
124 printf("[5] 使用next[]进行匹配
");
125 printf("[6] 使用nextval[]进行匹配
");
126 printf("[0] 按其他键退出
");
127 scanf("%d",&in);
128 return in;
129 }
130
131 void Reply(SqString &s,SqString &t,int next[],int nextval[],int in) //对菜单的选项进行应答
132 {
133 switch(in){
134 case 1: //输入目标串
135 scanf("%s",s.data);
136 s.length = strlen(s.data);
137 break;
138 case 2: //输入模式串
139 scanf("%s",t.data);
140 t.length = strlen(t.data);
141 GetNext(t,next);
142 printf("next[]生成成功!
");
143 GetNextval(t,nextval);
144 printf("nextval[]生成成功!
");
145 break;
146 case 3: //输出模式串的next数组
147 if(next[0]==0){
148 printf("您还没有输入模式串!
");
149 break;
150 }
151 printNext(t,next);
152 break;
153 case 4: //输出模式串的nextval数组
154 if(next[0]==0){
155 printf("您还没有输入模式串!
");
156 break;
157 }
158 printNextval(t,nextval);
159 break;
160 case 5: //使用next[]进行匹配
161 if(s.data[0]=='