資料結構與演算法 KMP演算法

2021-10-06 14:56:11 字數 2197 閱讀 8711

給兩個字串 s1 s2 ,求s2在s1中是否出現過,出現過的話,給出在s1中的第乙個索引。

首先根據s2維護乙個字首字尾表,比如:abbac : [-1, 0, 0, 0, 1]

然後在與s1進行比較,比如:

miabbabbac 與 abbac

首先有兩個下標指標分別分i, j;s1[i]與s2[j]進行比較,不一樣。

判斷j能不能跳到自己維護的字首表裡的字首,此時next[j] =-1說明此時j就是第乙個字元,說明第乙個字元都匹配不上,那麼i++,也就是從s2的第二個字元開始判斷

s2[i] == s1[j]發現不相等,然後判斷j有沒有字首可以跳,也就是next[j] == -1發現跳不了,那麼繼續i++s1的第三個字元開判斷

j跳到next[j]然後判斷s1[i] == s2[j],相等了,那麼s1s2同時i++ j++判斷s1[i] == s2[j],還是相等,那麼繼續i++ j++,然後判斷b==b,還是相等,i++ j++發現a == a,繼續i++ j++發現b!=c此時不相等

然後因為此時c之前的字串已經判斷完了,都是相同的,那麼我們就利用這個資訊也就是從j = next[j]開始判斷s1[i] == s2[j]也就是b == s2[1] (也就是b),相等,然後繼續i++ j++最後發現i走過的路>jj走過的就是s2的長度 起始位置就是i - j判斷方法就是j == s2.length()

【leetcode 28】

public

class

kmpif

(haystack ==

""|| needle.

length()

> haystack.

length()

)int i1 =0;

int i2 =0;

int[

] next =

getnext

(needle)

;while

(i1 < haystack.

length()

&& i2 < needle.

length()

)else

else}}

return i2 == needle.

length()

? i1 - i2 :-1

;}private

static

int[

]getnext

(string str)

int[

] next =

newint

[str.

length()

];if(str.

length()

==1)if

(str.

length()

==2)int i =2;

next[0]

=-1;

next[1]

=0;int cn =0;

while

(i < str.

length()

)else

if(cn >0)

else

}print

(next)

;return next;

}public

static

void

print

(int

a)system.out.

println()

;}public

static

void

main

(string[

] args)

}

資料結構與演算法 KMP演算法模板

kmp演算法指的是字串模式匹配演算法,問題是 在主串t中找到第一次出現完整子串p時的起始位置。該演算法是三位大牛 d.e.knuth j.h.morris和v.r.pratt同時發現的,以其名字首字母命名。下面是kmp演算法的c 版本 include include include using na...

資料結構 KMP演算法

求串的模式值next n 定義 1 next 0 1 意義 任何串的第乙個字元的模式值規定為 1。2 next j 1 意義 模式串t中下標為j的字元,如果與首字元相同,且 j的前面的 1 k個字元與開頭的 1 k個字元不等 或者相等但t k t j 1 k 如 t abcabcad 則next 6...

資料結構 KMP演算法

在我的理解,kmp演算法最核心的同時最難理解的是這個next 函式。但是,next 的值是挺好求的,難在哪呢?這個函式難在邏輯。理解起來很費勁,但真的很好用,並且這個函式的結果很好求。例如求模式串t ababaaa 的next j 的函式值 是這樣的,當j 0,next 0 1,對於任何子串,第乙個...