前の暴力行為は、文字列照合アルゴリズムに言及したが、明らかに問題が暴力行為があります:一つだけの文字を移動する時間が。しかし、実際には、別の試合の状況のために、各移動間隔を大きくすることができますが、それぞれの時間に移動する必要はありません。
KMPアルゴリズムの説明については、我々はブログをお勧めします。https://blog.csdn.net/weixin_36604953/article/details/78576637
ブログを詳細にKMPアルゴリズムの原則を説明しています。次のコードはKMPアルゴリズムを実装しています。
1 // 強引な方法を使用して、KMPは、文字列マッチングアルゴリズムアルゴリズム完了 2含める位" のiostream " 3。の#include " 文字列" 4。の#include " ベクター" 5。 使用した 名前空間STD; 6ベクトル< INT >&BFmatch(文字列、&文字列&、ベクトル< INT >&); 7ベクトル< INT >&KMPStrMatch(文字列&、文字列&、ベクトル< INT >& )。 8 のボイドShowpos(ベクトル< INT >&); 9。 INT メイン() 10 { 11。 文字列ModelStr、SonStr; 12である ベクトル< INT > POS; 13は COUT << " 一致する文字列を入力してください" ; 14 CIN >> ModelStr; 15 << COUTのENDL; 16 COUTは、<< " 部分文字列を入力してください:" ; 。17 CIN >> SonStr; 18は、 COUT << てendl; 19。 // BFmatch(ModelStr、SonStr、POS); 20 KMPStrMatch(ModelStr、SonStr、POS)。 21 ShowPos(POS)。 22 システム(「一時停止」)。 23 } 24ベクター< INT >&BFmatch(文字列&ModelStr、文字列&SonStr、ベクトル< INT >&POS) 25 { 26 のための(int型 I = 0 ; iが++; iがModelStr.size()< ) 27 { 28 のint kは= 0 ; 29 のために(INT J =; <SonStr.sizeを()は、k、jは++、K ++) 30 { 31 であれば(SonStr [K] == ModelStr [J]) 32 続けます。 33 他 34 ブレーク。 35 } 36 であれば(K == SonStr.size()) 37 pos.push_back(I)。 38 } 39台の リターンPOS。 40 } 41 空隙 ShowPos(ベクトル< INT >&POS) 42 { 43 であれば(pos.size()!= 0 ) 44 { 45 裁判所未満<< 「MatchingStrの最初の位置:」; 46 のために(int型 I = 0 ; iが++; iがpos.size()< ) 47 { 48台の COUT << POS [I] << " \ tを" 。 49 } 50 COUT << ENDL。 51 } 52 他の 53 coutの<< " !いいえ、そのような文字列" << てendl; 54 } 55ベクター< INT >&&ModelStr、文字列&SonStr、ベクトル< INT >&POS) 56 { 57 列ComStr。 58 文字列TMP1、TMP2。 59 int型 J = 0、I = 0、LEN = 0 ;; 60 一方(J <(ModelStr.size() - SonStr.size()+ 1 )) 61 { 62 であれば(ModelStrは[J] = SonStr [!0 ]) 63 { 64 J ++ 。 65 続け ; // 首位不匹配直接加1 66 } 67 他の 68 { 69 ながら((J <ModelStr.size())&&(ModelStr [J] == SonStr [I]))// &&上記制約はメモリ境界を生じないことを保証する 70 { 71は Jを++ ; 72 I ++は、 73である } 74 IF(I == SonStr.size()) 75 pos.push_back(J - SonStr.size()); 76 J = J - I; 77 ComStr SonStr.substr =(0、I - 1 ); 78 用(INT Q = 1。Q <ComStr.size()。Q ++ ) 79 { 80 TMP1 = ComStr.substr(Q、ComStr.size() - 1 )。 81 TMP2 = ComStr.substr(0、ComStr.size() - 1 - Q)。 82 であれば(TMP1 == TMP2) 83 LEN ++ 。 84 } 85 J = J + I- LEN。 86 、I = 0 。 87 LEN = 0 。 88 } 89 } 90 リターン送料。 91 }
要するに、KMPの核となるアイデアは、次のとおりだけそれぞれを移動させるのではなく、文字列の一致部分の長さにマッチする文字列の長さを移動することを決定します。