次のアレイ解決(コード)KMPアルゴリズム

EDITORIAL

408を伴う最初のビデオ嗶哩嗶哩参照するには、時間の試験研究期間:
リンク:リンクを
主に検査するために、このビデオにに、コードの考えを言わなかった、彼らは明確に考えていない場合は、ここで私は、双方向ビデオ、ライト・コードに沿っています場所は、王は指摘し、あなたはこのビデオを見ることができます。

思考

例として:
ここに画像を挿入説明
私たちが最初にMAXLを見つけることができます知って観察、MAXLは、現在の文字列マッチングの終わりです。

計算方法:

最初のデフォルト値は0であり、2つ目は、(bが0であり、従って異なる場合)、同じ0と異なる場合。
文字列は、デフォルトでゼロから:(計算することができるので、上記数はスタートコードからではなく1から始まる0)を以下のようにしているので、その後の配列、
何らかの前の文字に一致する前の文字の最後であります文字列は、現在の文字[i]が1の正面の文字と同じ、MAXLに一致する文字であってもよいそうである場合= MAXLは[iが -1] +1、 +1次配列の数に得られます。
そうでない場合、それは現在の文字に依存し、同じの最初の文字は、1、または0と異なる場合で、現在の文字列の先頭に、時と同じで、同じではありません。

上記缶は読んでいない場合は、直接の例を見て:

4の数として、それは彼の3位Aの前にある、MAXL [3] = 1 、 2の数を見つけるために次の番号が、Bであり、Bは、異なるています。それは決定され、それが同じものであるため、文字列の先頭は、同じです。
+1によってその後一パン右添加-1左、MAXL探し出した後(したがって次、本来0の初めから[0] = MaxLの[0 ] 、必要に移動しない)サイクルの残りの溶液。

for(int i =s.length()-1;i>0;i--){
		next[i]=next[i-1]+1;
	}

コード

あなたは私が醜いコード泥棒を書くと思えば当然のことながら、独自の変更だけで罰金を変更するには

#include<stdio.h>
#include<string>
#include<iostream>
using namespace std;
int next[100];
void getnext(string s){
	next[0]=0;
	for(int i =1;i<s.length();i++){
		if(i==1){
			if (s[1]==s[0]) next[1]=1;
			else next[1]=0;
		}
		if(s[i]==s[next[i-1]]) next[i]=next[i-1]+1;
		else if (s[i]==s[0]) {
			next[i]=1;
		}
		else{
			next[i]=0;
		} 
	}
	for(int i =s.length()-1;i>0;i--){
		next[i]=next[i-1]+1;
	}
}
int main(){
	string s;
	cin>>s;
	getnext(s);
	for(int i =0;i<s.length();i++)
	printf("%d ",next[i]);
	
}

業績は、マップ

ビデオの例:
ここに画像を挿入説明
王のタイトルデータ構造KMP 6:
ここに画像を挿入説明
正しいです

公開された12元の記事 ウォンの賞賛3 ビュー1285

おすすめ

転載: blog.csdn.net/github_38201918/article/details/104080943