直接按照书上所说代码实现的,就是把两个串连接起来,利用了KMP算法实现字符串的匹配,直接贴代码:
1 #include "stdafx.h"
2 #include <IOSTREAM>
3
4 using namespace std;
5
6 void ComputePrefix(const char *str, int *pi){
7 if(NULL==str || NULL==pi)
8 return;
9 int len = strlen(str);
10 pi[0] = 0;
11 int k = 0;
12 for (int i=2; i<=len; i++)
13 {
14 while (k>0 && str[k]!=str[i-1])
15 k = pi[k-1];
16 if(str[k] == str[i-1])
17 k++;
18 pi[i-1] = k;
19 }
20 }
21
22 bool KMP(const char *str1, const char *str2){
23 bool isMatch = false;
24 int len1 = strlen(str1);
25 int len2 = strlen(str2);
26
27 int *pi = new int[len2];
28 if(NULL!=pi)
29 ComputePrefix(str2,pi);
30 else
31 return false;
32
33 int k=0;
34 for (int i=1; i<=len1; i++)
35 {
36 while (k>0 && str2[k]!=str1[i-1])
37 k = pi[k-1];
38 if(str2[k]==str1[i-1])
39 k++;
40 if(k==len2){
41 isMatch = true;
42 break;
43 }
44 }
45
46 delete[] pi;
47 return isMatch;
48 }
49
50 bool isInclude(char* str1, char *str2){
51 if(NULL==str1 || NULL == str2)
52 return false;
53
54 int len1 = strlen(str1);
55 int len2 = strlen(str2);
56 if(len2!=len1)
57 return false;
58 char *strTemp = new char[len1+len2+1];
59 if(NULL == strTemp)
60 return false;
61 strcpy(strTemp, str1);
62 strcat(strTemp, str1);
63 cout << strTemp << endl;
64
65 bool isIN = KMP(strTemp,str2);
66 delete[] strTemp;
67 return isIN;
68 }
69
70 int main(int argc, char* argv[])
71 {
72 cout << isInclude("ABCD","DCAB") << endl;
73 return 0;
74 }
浙公网安备 33010602011771号