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演算法 主...