字符串查找算法

总结下字符串匹配算法:

BF(Burte Force):暴力匹配算法。从主串第一个字符开始与模式串比对,若相等,则主串和模式串都后移一个字符继续比较;若不相同,则主串后移一个字符,模式串从第一个字符开始比较。知道模式串中的每个字符与主串的一个连续字符串相等,则匹配成功,返回模式串第一个字符在主串的位置;否则匹配失败。最坏情况下,为o(M*N)。

BM(Boyer Moore)算法: 时间复杂度O(n)

构造两个跳转表:坏字符表和好后缀表。

坏字符规则:当主串的字符同模式串的字符不同时,这个字符就是坏字符,此时模式串向右移动,移动的位数=模式串比较的位置-坏字符在模式串中最右出现的位置。如果坏字符不再模式串中,则最右位置为-1.

好后缀规则: 当字符不相同时,后移位数=好后缀在模式串中的位置-好后缀在模式串上一次出现的位置。如果好后缀在模式串中没有再次出现,则为-1.

算法:主串和模式串头部对齐,比较尾部。如果不匹配,则是坏字符,则移动到对应的好后缀位置,否则到坏字符位置。如果匹配,则继续比对。

Sunday算法: 1. 从主串的第n个字符开始,与模式串第一个字符比较,若相等,则继续比较; 2. 若不相同,则将主串参与匹配的最后一位后面的字符与模式串逆着匹配; 3. 如果模式串中没有这个字符,则直接跳过。4. 如果模式串匹配到了这个字符,则将模式串中相同字符移动到主串该字符下,与该字符对齐。

KMP(Knuth-Morris-Pratt)算法:

Next表:

next[0]=-1;

next[j]=-1;模式串中下标为j的字符,如果与首字符相同,且其前面的1-k个字符与开头的1-k个字符不等(或相等但T[k]=T[j]) (1k<j)

next[j]=k; 模式串中下标为j的字符,如果j的前面k个字符与开头的k个字符相等,且T[j] != T[k]

next[j]=0; 除前面的情况。

算法:文本串匹配到i位置,模式串匹配到j位置:

1. 如果j=-1,或当前字符匹配成功,则i++, j++,继续匹配下一个字符;

2. 如果j!=-1,其当前字符匹配失败,则 i 不变,j=next[j]。继续比对。

参考:

http://blog.csdn.net/zuochao_2013/article/details/71077895

http://blog.csdn.net/sjf0115/article/details/8579484

    原文作者:awesomeray
    原文地址: https://blog.csdn.net/awesomeray/article/details/76202489
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞