1 #include<iostream>
2
3
4 using namespace std;
5
6 #define MAX 255
7
8 typedef unsigned char BYTE;
9
10 typedef BYTE String[MAX+1];
11
12 bool strAssign(String& strTemp,char* Temp); //定长字符串存储
13 bool strTravel(String& strTemp); //打印
14 void KMP(String& strMother,String& strSon,int* pData);
15 void GetNext(String& strSon,int* pNext);
16 //KMP算法的实现要求两个子函数 KMP() 和GetNext()
17
18 void main()
19 {
20
21 String strMother;
22 memset(strMother,0,sizeof(strMother));
23
24 String strSon;
25 memset(strSon,0,sizeof(strSon));
26
27 strAssign(strMother,"HHHeHeHHe");
28 strAssign(strSon,"HeHe");
29
30
31 strTravel(strMother);
32 strTravel(strSon);
33 int* pData = (int*)malloc(sizeof(int)*(strMother[0]+1));
34
35 KMP(strMother,strSon,pData);
36
37 int i = 0;
38 for(i=1;i<=pData[0];i++)
39 {
40 cout<<pData[i]<<" ";
41
42 }
43 cout<<endl;
44
45 }
46 bool strAssign(String& strTemp,char* Temp)
47 {
48 strTemp[0] = strlen(Temp);
49
50
51 int i = 1;
52 for(i=1;i<=strTemp[0];i++)
53 {
54 strTemp[i] = Temp[i-1];
55
56 }
57
58 return true;
59
60 }
61 bool strTravel(String& strTemp)
62 {
63 int i = 1;
64 for(i=1;i<=strTemp[0];i++)
65 {
66 cout<<strTemp[i]<<" ";
67
68 }
69
70 cout<<endl;
71 return true;
72
73 }
74 void KMP(String& strMother,String& strSon,int* pData)
75 {
76 int* pNext = (int*)malloc(sizeof(int)*(strSon[0]+1));
77
78 GetNext(strSon,pNext);
79
80
81 int i = 1;
82 int j = 1;
83 int k = 1;
84
85 while(i<=strMother[0])
86 {
87 if(i==0||strMother[i]==strSon[j])
88 {
89 i++;
90 j++;
91
92 }
93 else
94 {
95 j = pNext[j];
96
97 }
98
99 if(j>strSon[0])
100 {
101 pData[k] = i-strSon[0];
102 k++;
103 j=1;
104
105 }
106
107
108 }
109
110
111 pData[0] = k-1;
112 free(pNext);
113
114
115 }
116 void GetNext(String& strSon,int* pNext)
117 {
118 pNext[1] = 0;
119
120 int i = 1;
121 int j = 0;
122
123 while(i!=strSon[0])
124 {
125 if(j==0||strSon[i]==strSon[j])
126 {
127 i++;
128 j++;
129
130 pNext[i] = j;
131
132
133
134 }
135 else
136 {
137 j = pNext[j];
138
139 }
140
141
142 }
143 }
KMP字符串匹配
时间: 2024-12-25 12:42:29