---- KMP文字列照合アルゴリズムアルゴリズム

前の暴力行為は、文字列照合アルゴリズムに言及したが、明らかに問題が暴力行為があります:一つだけの文字を移動する時間が。しかし、実際には、別の試合の状況のた​​めに、各移動間隔を大きくすることができますが、それぞれの時間に移動する必要はありません。

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 = 1Q <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の核となるアイデアは、次のとおりだけそれぞれを移動させるのではなく、文字列の一致部分の長さにマッチする文字列の長さを移動することを決定します。

 

おすすめ

転載: www.cnblogs.com/shaonianpi/p/11413551.html