ITPub博客

首页 > 应用开发 > IT综合 > KMP字符串匹配算法

KMP字符串匹配算法

原创 IT综合 作者:icare 时间:2008-03-17 20:34:36 0 删除 编辑

花了一天,边玩边看KMP字符串匹配算法,效率真tm低,不够还算搞明白了,看在周末的份上,原谅自己了,呵呵。记录一下。
命题:设计算法,在字符串s中,从pos位置开始,查找第一个与目标字符串t相同的子字符串的起始位置。
kmp算法实现:第一步,预处理目标字符串t,求出t中每一个字符在与源字符串s中字符不等时移到的位置。方法是根据如下公式
next[0] = -1;
next[j] = max{k| 0next[j] = 0;
此公式可如下证明
首先,假设目标字符串下一次移动到k位置,那么这个k位置有什么特性呢,k之前的所有字符(k个,从0开始),应该和源字符串s中i位置前的k个字符相同,即:
"t0t1...t(k-1)" == "s(i-k)s(i-k+1)...s(i-1)"
而且,这时候,源字符串i位置之前的k个字符和目标字符串j位置之前的k个字符也相同,即:
"t(j-k)t(j-k+1)...t(j-1)" == "s(i-k)s(i-k+1)...s(i-1)"
那么得到如下结论
"t0t1...t(k-1)" == "t(j-k)t(j-k+1)...t(j-1)"
第二步,循环源字符串和目标字符串,如下吧,这段不好说了

while(s[i] != ' && t[j] != ')
{
if(j == -1 || s[i] == t[j]) //j==-1表示s[i]与t[0]不同
{
i++;
j++;
}
else
{
j = next[j];
}
}
if(t[j] == ')
return i-j;
else
return 0;

[@more@]

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/13402735/viewspace-1001074/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 一切从这里开始
下一篇: 没有了~
请登录后发表评论 登录
全部评论
  • 博文量
    2
  • 访问量
    2522