KMP(アルゴリズムの説明)

#include <iostreamの> 使用して名前空間STD; のconst int型 N = 10010、M = 100010 ;
 INT N-、M;
 CHAR P [N]、S [M];
 INT NE [N]; int型のmain()
{ 
    CIN >> N- >> P + 1 >> M >> Sの+ 1 ;
     // 次見つける:短いアレイのためにINT I = 2、J = 0 ; I <= N; I ++は
    { 一方(J && P [I] = P! [+ J 1。 ])J = NE [J]; // マッチしない、短いマッチの配列の前縁の同じ位置から開始IF(P [I] == P [J +

 

 


    
        
        1 ])J ++ 
        NEの[i]を = J; 
    } 
    // KMP匹配
    ためINT I = 1、J = 0 ; I <= M; iは++ 
    { 
        一方(J && S [I] = P [J +!1 ])J = NE [J]。
        もし(S [I] == P [J + 1 ])J ++ もし(jは== nの)// 匹配成功
        { 
            COUT << <<で'  ' 
            J = NE [J]。
        } 
    } 
    戻り  0 
}

同じ文字列マッチングを減らすことによって最適化されます

フォーカスが探している次のアレイ上にあります

 

jは:配列が小さい場合、マッチング処理が行われ、比較は、J + 1、J + 1も同じである同一位置jを交換しないとき、すなわち、次の対応する値を小さなフロント配列整合を有します。

おすすめ

転載: www.cnblogs.com/zwx7616/p/11106703.html