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:
正しいです