KMPアルゴリズム:
このアルゴリズムの性質は最初の配列(次のアレイ)を生成するために、テンプレート文字列に対して実行され、アレイは、テンプレート文字列の状況を反映しています。
例:
S:ABADACABABCD
P:BAB
我々は、アルゴリズムが暴力である場合P3およびS3(B及びD)は、等しくない照会すると、第2の文字を比較開始。
そしてKMPアルゴリズムは比較P3(から開始されるだけで引用上記の例に基づいてP3、得られた配列は、見つけるために次故障する場合、すべての位置P3、すなわち
ミスマッチは、中央値パターン文字列は右に動いている:文字の不一致位置-次の値が文字の不一致に対応します)
時間の複雑さを軽減するという目的を達成するために、再び見つけるために、配列を。
次の配列:
{次の最大配列の長さの値との関係:次の配列に相当する「最大長」の右に全体動きは、次に初期値が割り当て-1。}
この資料では、コメントを表示するには、以下のリンクをクリックした場合(非常に明確に説明)、KMPアルゴリズムの具体的な検討を理解することにあります。
オリジナルリンクします。https://blog.csdn.net/v_july_v/article/details/7041827
以下は、javaの実現の具体例であります:
1つの パブリック クラスKMP {
2つの
3 プライベート文字列TS。
4つの プライベート列PS;
5 KMP(){
6 }
7 KMP(文字列TS、列PS){
8 本 .TS = TS。
9 この .PS = PS。
10 }
11 公共 ボイド敷石(文字列TS){
12 この .TS = TS。
13 }
14 公共 ボイドsetps(列PS){
15 この .PS = PS。
16 }
17 公共 int型 kmpmatch(){ // KMP开始运算
18 INT SLEN = ts.length()。
19 INT PLEN = ps.length()。
20 INT I = 0 。
21 のint J = 0 。
22 INT []次= getNextを(PS)。
23 一方(I <SLEN && J < PLEN){
24 であれば(J == - 1 || ts.charAt(I)== ps.charAt(J)){
25 I ++ 。
26 J ++ ;
27 }他{
28 J = 次の[J]。
29 }
30 }
31 であれば(J == PLEN){
32 リターン I- J。
33 } 他{
34 リターン -1 。
35 }
36
37 }
38 公共 のint [] getNextを(列PS){
39 のchar [] P = ps.toCharArray()。
40 INT []次= 新しい INT [p.length]。
41 次の[0] = - 1 ;
42である int型 J = 0 ;
43である 整数 K = -1 ;
44は 、一方(J <-p.length 1){ // アルゴリズムの本質!!!!!
45 IF(K == - 1 || Pは[J] ==。P [K]){
46が K ++ ;
47 J ++ ;
48 IF(P [J] =!P [K]){
49 次に[J] = K ;
50 } 他{
51は、 次に[J] = 次に[K];
52である }
53れます }他{
54 、K = 次の[K]。
55 }
56 }
57 リターン次。
58 }
59
60
61
62 公共 静的 ボイドメイン(文字列[]引数){
63 // TODO自動生成方法スタブ
64 列A = "wdnmwdnmwdnmddnm" 。
65 文字列B = "wdnmwdnmd" 。
66 KMPのK = 新しいKMP()。
67 k.setts(A)。
68 k.setps(B)。
69 System.out.println(k.kmpmatch()); // 出力4
70 }
71は、
72 }