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算法还快的

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

  • 相关阅读:
    Unable To Open Database After ASM Upgrade From Release 11.1 To Release 11.2
    11g Understanding Automatic Diagnostic Repository.
    How to perform Rolling UpgradeDowngrade in 11g ASM
    Oracle 11.2.0.2 Patch 说明
    Pattern Matching Metacharacters For asm_diskstring
    Steps To MigrateMove a Database From NonASM to ASM And ViceVersa
    Upgrading ASM instance from Oracle 10.1 to Oracle 10.2. (Single Instance)
    OCSSD.BIN Process is Running in a NonRAC Environment
    Steps To MigrateMove a Database From NonASM to ASM And ViceVersa
    On RAC, expdp Removes the Service Name [ID 1269319.1]
  • 原文地址:https://www.cnblogs.com/zhoubo123/p/11164054.html
Copyright © 2011-2022 走看看