DS文字列アルゴリズム適用--KMP

タイトル説明

KMP文字列がメインの文字列のモード位置を求めて、メインの文字列と文字列のパターンで与えられ、学習アルゴリズム

参考のために以下のアルゴリズムの枠組み

 

 

 

 

 

 

 

エントリー

発現最初の入力T、Tのインスタンス

メインストリングの最初のインスタンスの2行目、パターン文字列の第三の例の最初の入力ラインに入ります

等々

輸出

次の値のパターン文字列の最初のインスタンスの最初のライン出力

出力位置整合が故障出力0に一致する、成功した場合に第一出力整合インスタンスの第2の行の位置は、位置計算から始まります

等々

サンプル入力

3 qwertyuiop TYU AABBCCDD CCC aaaabababac ABAC

サンプル出力

-1 0 0 5 -1 0 1 0 -1 0 0 1 8

プロンプト

 

 なぜ同じ次の値と教科書?

書式#include <iostreamの> 
の#include < 文字列 >
 使用して 名前空間はstdを、
INT * GETNEXT(P)
{ 
    int型 J = 0、K = - 1 int型 *次回= 新しい int型[p.size()]; 
    次の[ 0 ] = - 1 一方、(J <(INT)p.size() - 1 
    { 
        もし(K == - 1 || P [j] == P [K])
        { 
            J ++ 
            K ++; 
            次の[J] = K。
        } 
        
            K = 次の[K]。
    } 
    戻り次。
} 
 
INT KMP(ストリング S、文字列P)
{ 
    INT iは= 0、J = 0 int型 *次回= GETNEXT(P);
    一方、(I <(INT)s.size()&& J <(INT )p.size())
    { 
        場合(J == - 1 || S [I] == P [J])
        { 
            I ++ 
            J++ ; 
        } 
        そう
            J = 次の[J]。
    } 
    であれば(j ==(INT )p.size())
         を返す I-J + 1 リターン 0 ; 
} 
 
int型のmain()
{ 
    int型T。
    CIN >> T;
    一方、(T-- 
    { 
        ストリングS、P。
        CIN >> S >> P;
        int型 *次回= GETNEXT(P);
        以下のためのint型私は= 0を I <(; int型)p.size(); I ++ 
        { 
            COUT <<次の[I] << "  " 
        } 
        COUT << ENDL。
        COUT << KMP(S、P)<< ENDL。
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/SZU-DS-wys/p/12180739.html