zoukankan      html  css  js  c++  java
  • 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位比较,没有意义

  • 相关阅读:
    网站常见的反爬虫和应对方法
    网站反爬虫
    webmagic的设计机制及原理-如何开发一个Java爬虫
    腾讯社区搜索架构演进
    搜索引擎评估与互联网用户行为建设
    深层网络搜索核心技术研讨
    Solr与Cassandra二级缓存实践
    .NET的前世今生与将来
    技术人生的职场众生相
    爆栈之旅
  • 原文地址:https://www.cnblogs.com/-glb/p/13308643.html
Copyright © 2011-2022 走看看