11// ////////////////////////////////////////////////////////////////////////
22// / @file string_match.cpp
3- // / @brief 字符串的几种匹配算法
3+ // / @brief 字符串匹配算法
44// / @details COPYRIGHT NOTICE
55// / Copyright (c) 2011
66// / All rights reserved.\n
@@ -91,7 +91,7 @@ namespace ita
9191 // step 1: get pi array
9292 vector<int > pi (p.size (), 0 );
9393
94- for (int i = 2 ; i < p.size (); ++i){
94+ for (int i = 1 ; i < p.size (); ++i){
9595 for (int j = i - 1 ; j >= 0 ; --j){
9696 if (p.substr (0 , j + 1 ) == p.substr (i - j, j + 1 )){
9797 pi[i] = j + 1 ;
@@ -103,10 +103,8 @@ namespace ita
103103 // step 2: match
104104 for (int i = 0 ; i <= text.size () - p.size (); ){
105105 int j = 0 ;
106- for (; j < p.size (); ++j){
107- if (text[i + j] != p[j]){
108- break ;
109- }
106+ while (j < p.size () && text[i + j] == p[j]){
107+ ++j;
110108 }
111109
112110 if (j >= p.size ()){ // matched:匹配成功
@@ -116,7 +114,7 @@ namespace ita
116114 ++i;
117115 }
118116 else {
119- i += (j - pi[j - 1 ]); // skip:尽量跳跃 ,公式为j-1+1 - pi[j-1] = j-pi[j-1]
117+ i += (j - pi[j - 1 ]); // skip:尽量右移 ,公式为j-1+1 - pi[j-1] = j-pi[j-1]
120118 }
121119 }
122120
@@ -136,6 +134,7 @@ namespace ita
136134
137135 bool b1 = (KMPMatch (text, pattern) != -1 );
138136 bool b2 = (matcher.Match (text) != -1 );
137+
139138 if (b1 != b2){
140139 cout << " 两种方法结果不同!!! : " << text << endl;
141140 }
@@ -150,8 +149,11 @@ namespace ita
150149 cout << " 至少一种方法未匹配成功 : " << text << endl;
151150 }
152151 }
153-
154-
152+ else {
153+ if (b1 || b2){
154+ cout << " 不包含 'abc' 的串被某种方法误匹配:" << text << endl;
155+ }
156+ }
155157 }
156158
157159 return 0 ;
0 commit comments