文本Tn 模式Pm, P在T中出现的位置为偏移
字符串匹配问题描述为:找出所有偏移s(0=<s<=n-m),使得P为Ts+m的后缀。
分两步完成,预处理+匹配
算法
|
预处理时间
|
匹配时间
|
朴素算法
|
o
|
O((n-m+1)m)
|
RK算法
|
O(m) |
O((n-m+1)m)
|
有限状态机
|
O(m|∑|)
|
O(n)
|
KMP
|
O(m)
|
O(n)
|
1.朴素字符串模式
for s=0 to n-m
ifP[1...m]==T[s+1...s+m]
print "找到偏移S"
2.KMP
难点:求带匹配的串的前缀next数组
特点:
它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,避免不必要的回溯,加快匹配速度。
1.next数组
next数组是用来说明待匹配的串的对称性,最大公共前后缀
a b c d a b d
next: 0 0 0 0 1 2 0
字串a的最大公共前后缀为0,a b c d a 最大公共前后缀为ab,长度为2
优化版:
- void get_next(char str[], int n,int next[])
- {
- int