关于KMP模式匹配的理解
2008-03-19 21:54
218 查看
假设主串为‘s1s2.....sn’,模式串为‘p0p1....pm’,当si不等于pj时,即匹配过程产生了“失配”,模式串“向右滑动”可行的距离最远是多少,这是要解决的问题。
假设此时应与模式中第k(k<j)个字符继续比较,则模式中应满足
'P0P1...............Pk-1' = 'Si-k Si-k+1...............Si-1’ (1)
且不存在k‘>k 满足上述表达式。而已经得到的部分匹配的结果式
'Pj-k+1Pj-k+2.......Pj-1' = 'Si-k Si-k+1...............Si-1’ (2)
由(1)式和(2)式可得
'P0P1...............Pk-1' = 'Pj-kPj-k+1.......Pj-1'
若令next[j]=k, 则
主要是next[j]值的计算
next[0]=-1;
设next[j]=k,则
'p0.....pk-1'='pj-k........pj-1'
(1) 当 Pk=Pj时
'p0.....pk-1pk'='pj-k........pj-1pj'
next[j+1]=next[j]+1;
(2) pk!=pj
next[j]=k; next[k]=k'
p0......pk-1=pj-k.....pj-1 (3)
po.......pk'-1=pk-k'......pk-1 (4)
由(3)和(4)得po.......pk'-1=pk-k'.......pk-1=pj-k'.......pj-1=
若 Pj=Pk' next[j]=next[k']+1;
否则再继续上面的操作
void get_next(char *T)
...{
int i=0,j=-1,next[0]=-1,len=strlen(T);
while(i<len)
...{
if(j==-1||T[i]==T[j])
...{
i++;j++;
next[i]=j;
}
else j=next[j];
}
}
int Kmp_index(char *S,char *T,int pos)
...{
int i=pos,len1=strlen(S),len2=strlen(T),j=0;
while(i<len1 && j<len2)
...{
if(j==-1 || S[i] == T[j])
...{
i++; j++;
}
else j = next[j];
if(j>len2)
return i-j;
else return 0;
}
}
假设此时应与模式中第k(k<j)个字符继续比较,则模式中应满足
'P0P1...............Pk-1' = 'Si-k Si-k+1...............Si-1’ (1)
且不存在k‘>k 满足上述表达式。而已经得到的部分匹配的结果式
'Pj-k+1Pj-k+2.......Pj-1' = 'Si-k Si-k+1...............Si-1’ (2)
由(1)式和(2)式可得
'P0P1...............Pk-1' = 'Pj-kPj-k+1.......Pj-1'
若令next[j]=k, 则
主要是next[j]值的计算
next[0]=-1;
设next[j]=k,则
'p0.....pk-1'='pj-k........pj-1'
(1) 当 Pk=Pj时
'p0.....pk-1pk'='pj-k........pj-1pj'
next[j+1]=next[j]+1;
(2) pk!=pj
next[j]=k; next[k]=k'
p0......pk-1=pj-k.....pj-1 (3)
po.......pk'-1=pk-k'......pk-1 (4)
由(3)和(4)得po.......pk'-1=pk-k'.......pk-1=pj-k'.......pj-1=
若 Pj=Pk' next[j]=next[k']+1;
否则再继续上面的操作
void get_next(char *T)
...{
int i=0,j=-1,next[0]=-1,len=strlen(T);
while(i<len)
...{
if(j==-1||T[i]==T[j])
...{
i++;j++;
next[i]=j;
}
else j=next[j];
}
}
int Kmp_index(char *S,char *T,int pos)
...{
int i=pos,len1=strlen(S),len2=strlen(T),j=0;
while(i<len1 && j<len2)
...{
if(j==-1 || S[i] == T[j])
...{
i++; j++;
}
else j = next[j];
if(j>len2)
return i-j;
else return 0;
}
}
相关文章推荐
- 关于KMP模式匹配算法的个人理解
- KMP模式匹配算法的一些理解
- 教材上关于模式匹配中的求next数组的算法不易理解,本人自己编写了一个具有相同功能的子函数
- 彻头彻尾地理解KMP字符串模式匹配算法
- KMP模式匹配算法的两点理解
- 关于字符串模式匹配算法的一点理解
- KMP模式匹配算法详解(耐心看完定会理解)
- 理解与实现KMP模式匹配算法
- 自我理解的KMP 算法 模式匹配
- 快速模式匹配算法(KMP)的深入理解
- POJ 3080 Blue Jeans(KMP模式匹配)
- [转] 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽
- KMP字符串模式匹配详解
- 模式匹配 KMP
- 关于设计模式装饰器、适配器、代理模式的关键点理解
- 关于工厂模式的 个人理解
- AC自动机模板及对多模式匹配的理解
- 模式匹配的算法Kmp
- KMP 模式匹配算法原理分析
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽