KMP子串查找算法

时间:2020-07-15
本文章向大家介绍KMP子串查找算法,主要包括KMP子串查找算法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

问题:如何在目标字符串S中,查找是否存在子串P?

朴素解法:
int sub_str_index(const char* s, const char* p)
{
    int ret = -1;
    int sl = strlen(s);
    int pl = strlen(p);
    int len = sl - pl;
    
    for(int i=0; (ret<0)&&(i<=len); i++)
    {
        bool equal = true;
        
        for(int j=0; equal && (j<Pl); j++)
            equal = equal && (s[i + j] == p[j]);
    
        ret = (equal ? i : -1);
    }
    
    return ret;
}
朴素的解法是有问题的,
假设目标字符串是a b c d e
子串是          a b c z
p字符串中前三个字符比对都成功了,但是到了第4个字符,比对失败了。这个时候如果以朴素的解法应该如何做呢?
p字符串右移1个字符,继续比对。这样做虽然可以但是效率太低了,也没有意义,分析如下:
因为pa != pb 且pb == sb;
所以pa != sb,
因此,子串p右移1位比较,没有意义

部分匹配表是如何得到的?

 将中间的前缀、后缀、交集这几列去掉,得到的就是部分匹配表了

怎么编程产生部分匹配表?

 部分匹配表的递推与实现

朴素的解法是有问题的,假设目标字符串是a b c d e子串是          a b c zp字符串中前三个字符比对都成功了,但是到了第4个字符,比对失败了。这个时候如果以朴素的解法应该如何做呢?p字符串右移1个字符,继续比对。这样做虽然可以但是效率太低了,也没有意义,分析如下:因为pa != pb 且pb == sb;所以pa != sb,因此,子串p右移1位比较,没有意义

原文地址:https://www.cnblogs.com/-glb/p/13308643.html