标签:部分 ber http 直接 number src can 算法 layout
学一把看毛片算法我觉得自己才能变得更加出色
明明昨天的题我都知道怎么模拟了,但是还是不会改KMP,是我学丑了
KMP是Knuth-Morris-Pratt三人设计的线性时间字符串匹配算法
nxt数组的介绍,卧槽,直接找到太爽啦
就是我匹配的时候是可以回退的,因为字符的肯能性有限
比如aaaaaaaaab和aaaab进行匹配,aaaab是模式串,aaaaaaaaab是匹配串,我就不用回退那么多次数,因为及时往下推就好了
我匹配了一部分我就能回退到一定的位置
下面是一段演示
我用的求前缀函数
void pre(char *p) { int i,m,j; m=strlen(p); nex[0]=nex[1]=0; for(int i=1; i<m; i++) { j=nex[i]; while(j&&p[i]!=p[j])j=nex[j]; nex[i+1]=p[i]==p[j]?j+1:0; } }
aaaab
0 0 1 2 3
aba
0 0 0
伪代码
KMP-MATCHER(T, P)
1 n ← length[T]
2 m ← length[P]
3 π ← COMPUTE-PREFIX-FUNCTION(P)
4 q ← 0 ?Number of characters matched.
5 for i ← 1 to n ?Scan the text from left to right.
6 do while q > 0 and P[q + 1] ≠ T[i]
7 do q ← π[q] ?Next character does not match.
8 if P[q + 1] = T[i]
9 then q ← q + 1 ?Next character matches.
10 if q = m ?Is all of P matched?
11 then print "Pattern occurs with shift" i - m
12 q ← π[q] ?Look for the next match.
COMPUTE-PREFIX-FUNCTION(P)
1 m ← length[P]
2 π[1] ← 0
3 k ← 0
4 for q ← 2 to m
5 do while k > 0 and P[k + 1] ≠ P[q]
6 do k ← π[k]
7 if P[k + 1] = P[q]
8 then k ← k + 1
9 π[q] ← k
10 return π
标签:部分 ber http 直接 number src can 算法 layout
原文地址:http://www.cnblogs.com/BobHuang/p/7401125.html