**自大牛matrix67的部落格
a56b
b47a
a57a
a37a
a17a
0終於,a[8]=b[1],i變為8,j為1。事實上,有可能j到了0仍然不能滿足a[i+1]=b[j+1](比如a[8]="d"時)。因此,準確的說法是,當j=0了時,我們增加i值但忽略j直到出現a[i]=b[1]為止。
這個過程的**很短(真的很短),我們在這裡給出:
j =-1;for(
inti =0
; i
<
n; i++)
}
j:=0;fori:=
1ton do
begin
while
(j>0)
and(b[j+1
]<>
a[i])
doj:
=p[j];
ifb[j+1
]=a[i]
thenj:=
j+1;
ifj=m
then
begin
writeln(
'pattern occurs with shift ',i
-m);j:=
p[j];
end;
end;
p[5]=3是因為b[1..3]和b[3..5]都是"aba";而p[3]=1則告訴我們,b[1]、b[3]和b[5]都是"a"。既然p[6]不能由p[5]得到,或許可以由p[3]得到(如果b[2]恰好和b[6]相等的話,p[6]就等於p[3]+1了)。顯然,p[6]也不能通過p[3]得到,因為b[2]<>b[6]。事實上,這樣一直推到p[1]也不行,最後,我們得到,p[6]=0。
怎麼這個預處理過程跟前面的kmp主程式這麼像呢?其實,kmp的預處理本身就是乙個b串「自我匹配」的過程。它的**和上面的**神似:
p[0]=-1;
inti, j =-
1;for(i =1
; i
<
m; i++)
p[1]:=0;j:
=0;fori:=
2tom do
begin
while
(j>0)
and(b[j+1
]<>
b[i])
doj:
=p[j];
ifb[j+1
]=b[i]
thenj:=
j+1;
p[i]:=j;
end;
KMP演算法描述
kmp演算法是一種優秀的字串匹配演算法,字串匹配的常規演算法是一步一步進行移位和比較操作,直至找到完全相匹配的字串。下面通過乙個例子,為大家仔細說明kmp演算法的使用和思路 問題 在字串 deabcdababcdabcdabde 字串中,匹配字串 abcdabd 演算法思路 kmp演算法的思路在於,...
KMP演算法詳解(C語言實現)
kmp的演算法分析 kmp解決問題 清除bf演算法中主串s指標出現的回溯情況,即當主串s和子串t在某個字元不匹配的時侯,主串s的指標位置不變,改變子串t的指標位置,使主串和子串的字元匹配 演算法思路 建立乙個next陣列,當出現主串字元與子串字元不匹配時,將模式串t的指標 j 移動到next j 的...
c語言kmp演算法
kmp是一種可以在字串中迅速找到某乙個指定的連續字串的演算法。要理解這個演算法首先要了解如何得到字串的next值。傳統的匹配方法中,每與字串進行一次未完全匹配的比較,都要從頭開始再進行一次,於是kmp就有next陣列來避免這種重複的比較,進而降低時間複雜度。next陣列的含義 與字串相對應的下標表示...