來烤饃片咯(誤

2021-10-24 23:18:17 字數 1693 閱讀 9774

2.烤饃片

三、烤好了

總結幼稚(樸素)字串匹配法的時間複雜度為o(n²),並且指示主串的指標要來回回溯,看起來非常的不聰明。此時採用kmp演算法,應用next陣列,使得指示主串的指標不進行回溯且將時間複雜度降為o(m+n) (寫的有點粗略

貼出來手寫筆記

思路:虛擬乙個重複的模式串並定義next[j]=t;

情況① pj == pt 可以得知next[j+1] == t+1 == next[j+1]+1;

情況② pj != pt 可以把原模式串看成主串,重複的模式串看成模式串,即令 t=next[t]

若t==0 next(j+1) == 1

偽**如下:

int

getnext

(char substr,

int next)

else

}}

對於aaaab這種模式串,如果在4號位置(下標從1)a不匹配,則3號,2號位置均不匹配,最終 j=0 考慮將j一步到位直接賦值為0

情況① j=1 nextval[j]=0

情況② j>1

若pj != pnext[j] nextval[j]=next[j]

若pj = pnext[j] nextval[j] = nextval[ next[j] ]

對next陣列的偽**進行修改可得:

int

getnextval

(char substr,

int nextval,

int next)

else

}}

很好理解,指標i,j分別指向主串和模式串下標為1的位置,j匹配到不匹配的地方就j = next[j] 進行回溯看很多教材下標為0的位置都空出用來存串的長度或者啥的,但個人感覺輸入上就有點問題了orz

直接上偽**:

int

kmp(

char str,

char substr)

else}if

(j>

strlen

(substr)

)return i-

strlen

(substr)

;else

return0;

}

c語言輸入上有些問題,為了使下標從1開始儲存,假設主串和模式串都是定長字串…

源**:

#include

#include

intgetnext

(char substr,

int next)

else}}

intkmp

(char str,

char substr)

else}if

(j>2)

return i-2;

else

return0;

}int

main()

for(i=

1;i<=

2;i++

)printf

("%d"

,kmp

(str,substr));

}

nextval陣列

輸入問題

模式匹配(Java) 烤饃片演算法

模式匹配是資料結構中字串的一種基本運算。由於字串我們學習過了,大部分操作都比較清楚,但是模式匹配相對來說操作稍微有些難度,所以我們在這裡簡單的進行講述。模式匹配的具體操作如下 給定乙個子串 也稱為模式串 要求在某個字串中找出與該子串相同的所有子串。我們在此講述2種常見實現 暴力匹配 kmp演算法 主...