zoukankan      html  css  js  c++  java
  • 字符串匹配问题(BF,KMP)

    对于字符串的匹配问题,现在自己能够掌握的就只有两种方法,

    第一种就是我们常用的暴力匹配法,那什么是暴力匹配法呢?

    假设我们现在有一个文本串和一个模式串,我们现在要找出模式串在文本串的哪个位置。

    文本串:ABCDABCCDABCY ABCDEDFC

    模式串:BCDED

    暴力的方法就是我们一个一个匹配;

    假设文本串匹配到j,模式串匹配到i;由上面我们可以看到  j=0,i=0;时,

    他们不能匹配,那么我们再从j=1;i=0;进行匹配,我们可以看到这是后他们可以匹配。

    我们进行操作j++,i++。我们又可以看到又是匹配的,再从进行j++,i++。

    直到j=4&&i=3的时候,我们可以看到这两个字符不能匹配,那么我们就要进行操作j++,i=0;

    模式串就要从头开始匹配。这样的做法就是当模式串的字符不能与文本串的字符相匹配的时候,

    模式串就要重新与文本串匹配。

     

    了解了暴力匹配的方法,下面我们来介绍KMP算法,为什么我们要学习这些算法呢,因为KMP算法在时间比暴力算法要

    优化许多。那什么是KMP算法呢,下面我们就来说说这个算法的核心思想。

    我们可以看到当文本串匹配到x的时候就匹配失败了,这是我们依然按照暴力匹配的方法进行匹配。

    我们还是用j代表文匹配的字符位置,i代表模式串匹配的字符位置。

    当我们匹配到j=10,也就是x的时候,i=6,也就是c的时候,这个时候匹配失败了。

    按照我们暴力的思路的话我们就得将模式串返回到开头,。而现在我们要用KMP算法来处理。

    可以看到,在我画了下划线的地方他们的字符串是一样的,所以当我们下一次匹配的时候就不用将

    模式串的i返回到0,可以直接返回到i=2,也就是c的位置,这样我们就得到了下图。

    按照这样的方法就可以找到模式串在文本串的位置。

    这样的方法我们就必须找到模式串中的前缀后缀最长公共元素长度。

    怎样来找这个前缀后缀最长公共元素长度得临时数组,文字叙述我叙述不清楚。

    大家看一看下面这个链接的视频,视频将这个方法将的非常的详细;

    链接:https://www.bilibili.com/video/av3246487?from=search&seid=5216993177757720410

    这个视频将kmp算法讲的非常的通俗易懂,在这里我给出求临时数组的代码,大家可以参考一下;

    这个代码是根据上面视频中的求临时数组的方法写的。

    这里求的数组并不是很多人讲的next数组,要想求next数组,我们只需要将

    我们求的数组的值往后移一位,然后将下标为0的数组对应的值赋为-1即可;

    即next[i]=next[i+1]&&next[0]=-1;

    讲的比较烂,毕竟是才学会这种算法,很多地方讲解的不是很清楚;

    附上大佬讲解的链接:https://www.cnblogs.com/ZuoAndFutureGirl/p/9028287.html

    上面这个链接的博主讲解的KMP算法讲解的十分详细,并且还拓展了两种比kmp算法还快的

    的算法,建议大家去看一看,收获一定会很大的。

  • 相关阅读:
    Activiti6详细教程
    Nginx 与 Tomcat : 413 Request Entity Too Large(请求实体太大)
    windows下安装pytorch
    vim编辑器常用操作
    el-dialog 里面的组件不刷新问题
    el-dialog 里面的 el-form 重置表单问题
    ElementUI树形表格默认展开
    设计模式之 工厂方法模式
    linux创建一个proc代码示例
    redis的安装及使用
  • 原文地址:https://www.cnblogs.com/zhoubo123/p/11164054.html
Copyright © 2011-2022 走看看