zoukankan      html  css  js  c++  java
  • KMP算法学习记录----Jake Boxer博文学习部分

    如需转载,请保留本文链接.

    Jake Boxer 英文博文链接:http://jakeboxer.com/blog/2009/12/13/the-knuth-morris-pratt-algorithm-in-my-own-words/

    如何使用部分匹配表

    1.作用:使用部分匹配表跳过那些已经做过的,旧的比较部分,从非重复匹配部分开始.

    2.if(匹配表结果大于1)

     {

      允许跳过的字符数量 = 匹配长度 - 部分匹配表[匹配长度-1];

        }

        else

     {

      允许跳过的字符数量 =  部分匹配表[匹配长度-1];

     }

    举例说明:

    使用"abababca"作为子串,匹配"bacbababaabcbab"母串.

    部分匹配表如下:

    字符串a|b|a|b|a|b|c|a

    索引值0|1|2|3|4|5|6|7

    匹配值0|0|1|2|3|4|0|1

    第一次匹配

    bacbababaabcbab

    abababca

    结果:无匹配结果

    第二次匹配

    bacbababaabcbab

      abababca

    结果:匹配数量为:1

    允许跳过的字符数量 =  部分匹配表[1-1]  = 0;

    第五次匹配

    bacb|ababa|abcbab

            |ababa|bca

    结果:匹配数量为:5

    允许跳过的字符数量 = 5 - 部分匹配表[5-1] = 5 - 3 = 2;

    第六次匹配

    bacbab|aba|abcbab

            xx|aba|babca

    跳过两个字符后,匹配结果如上,本次匹配结果为:3

    允许跳过的字符数量 = 3 -部分匹配表[3-1] = 3 - 1 = 2;

    第七次匹配

    bacbabab|a|abcbab

                xx|a|bababca

    跳过两个字符后,匹配结果如上,本次匹配结果为:1

    此时子串的尾字符,已经超出了主串的长度,因此,主串与子串无匹配结果.

    下一篇文章为《大话数据结构》KMP算法分析.

  • 相关阅读:
    Unix网络编程中的五种IO模型
    go工具库分析——go-snowflake
    defer
    滑动窗口
    快速幂
    Golang使用注意点
    微服务数据一致性基础认知
    KMP算法
    单调栈和单调队列
    LRU简单学习
  • 原文地址:https://www.cnblogs.com/yikecaidechengzhangshi/p/8573598.html
Copyright © 2011-2022 走看看