示例:
1. 已知字符串str1="acabaabaabcacaabc",求str2="abaabcac"是否在字符串str1中?
2. DNA病毒检测。已知患者DNA序列求病毒DNA序列是否在患者DNA中出现过?病毒DNA为环状结构(即首尾相连)。
此文以问题1为例进行解答。
一、BF算法

即暴力检测法,从字符串第一个字符开始和匹配字符串进行比较如果不同,则从字符串第二个位置开始比较直到结束。

BF算法思想很简单,直接列出代码实现:

 static void Main(string[] args)
{
string str = "acabaabaabcacaabc";//"aaabaaaaaab";
string mo = "abaabc";//"aaaab";int flag;//表示查询结果
flag = BF(str, mo, );
if (flag != -) Console.WriteLine("匹配成功!" + " 下标为: " + flag);
else Console.WriteLine("匹配失败!");
}
 private static int BF(string str, string mo, int v)
{
int i = v ,j = ;
while (i < str.Length && j < mo.Length)
{
if (str[i] == mo[j])
{
i++;
j++;
}
else
{
i = i - j + ;
j = ;
}
}
if (j >= mo.Length) return i - mo.Length;
else return -;
}
二、KMP算法

如图:

在检测中发现i和j标记的元素不同,此时如果是BF算法直接ii= i-j+1,j = 0.但是KMP算法思想是让i下标不变,j下标变化,即可以理解为数组str2右移尽可能少的单位。

问题来了,如何知道要移动多少呢?

如图,我们可以知道,在数组str2中j下标之前的所有元素都和数组str1的对应位匹配,那么我们只要保证,将str2数组向右移动k,使得在str2中j=k元素之前的元素依旧匹配即可。因此引入

前缀和后缀的概念,前缀:元素的真子集 ,后缀:元素的反向真子集。即如aba三个元素,最长前缀为ab,最长后缀为ba。但是只有前缀a和后缀a相同所以str2的第四个元素的

next值为1;也就是当匹配到str[3]不同于str1时,此时j下标变为1即str2向右移动到j==下标1。

为此我们只需要根据str2得到next数组就行。即得到str2的最大匹配前后缀个数。默认a[0]=0;即变化值为next值-1.因为next值是在字符串下标从1开始,我们开发通常下标从0开始

代码如下:

 static void Main(string[] args)
{
string str = "acabaabaabcacaabc";//"aaabaaaaaab";
string mo = "abaabc";//"aaaab";
int[] next=new int[mo.Length];
int flag;//表示查询结果
setNext(mo, next);
foreach (var item in next)
{
Console.Write(item + " ");
}
Console.WriteLine();
flag = KMP(str, mo, , next);
if (flag != -) Console.WriteLine("匹配成功!" + " 下标为: " + flag);
else Console.WriteLine("匹配失败!");
}
  private static void setNext(string mo, int[] next)
{
int i = , j = -;
next[] = -;
while (i < mo.Length - )
{
if (j == - || mo[i] == mo[j])
{
i++; j++;
next[i] = j;
}
else j = next[j];
}
}
   private static int KMP(string str, string mo, int v,int[] next)
{
int i = v, j = ;
while (i < str.Length && j < mo.Length)
{
if (j==- || str[i] == mo[j])
{
i++;
j++;
}
else
{
j = next[j];
}
}
if (j >= mo.Length) return i - mo.Length;
else return -;
}
//进一步对next数组优化
private static void setNextVal(string mo, int[] next)
{
int i = , j = -;
next[] = -;
while (i < mo.Length-)
{
if (j == - || mo[i] == mo[j])
{
i++; j++;
if (mo[i] != mo[j]) next[i] = j;
else next[i] = next[j];
}
else j = next[j];
}
}

字符串匹配算法 之BF、KMP的更多相关文章

  1. 字符串匹配算法之BF(Brute-Force)算法

    BF(Brute-Force)算法 蛮力搜索,比较简单的一种字符串匹配算法,在处理简单的数据时候就可以用这种算法,完全匹配,就是速度慢啊. 基本思想 从目标串s 的第一个字符起和模式串t的第一个字符进 ...

  2. 常用算法3 - 字符串查找/模式匹配算法(BF & KMP算法)

    相信我们都有在linux下查找文本内容的经历,比如当我们使用vim查找文本文件中的某个字或者某段话时,Linux很快做出反应并给出相应结果,特别方便快捷! 那么,我们有木有想过linux是如何在浩如烟 ...

  3. 数据结构4_java---顺序串,字符串匹配算法(BF算法,KMP算法)

    1.顺序串 实现的操作有: 构造串 判断空串 返回串的长度 返回位序号为i的字符 将串的长度扩充为newCapacity 返回从begin到end-1的子串 在第i个字符之前插入字串str 删除子串 ...

  4. Python 细聊从暴力(BF)字符串匹配算法到 KMP 算法之间的精妙变化

    1. 字符串匹配算法 所谓字符串匹配算法,简单地说就是在一个目标字符串中查找是否存在另一个模式字符串.如在字符串 "ABCDEFG" 中查找是否存在 "EF" ...

  5. 数据结构学习之字符串匹配算法(BF||KMP)

    数据结构学习之字符串匹配算法(BF||KMP) 0x1 实验目的 ​ 通过实验深入了解字符串常用的匹配算法(BF暴力匹配.KMP.优化KMP算法)思想. 0x2 实验要求 ​ 编写出BF暴力匹配.KM ...

  6. 数据结构- 串的模式匹配算法:BF和 KMP算法

      数据结构- 串的模式匹配算法:BF和 KMP算法  Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...

  7. 字符串匹配算法 - KMP

    前几日在微博上看到一则微博是说面试的时候让面试者写一个很简单的字符串匹配都写不出来,于是我就自己去试了一把.结果写出来的是一个最简单粗暴的算法.这里重新学习了一下几个经典的字符串匹配算法,写篇文章以巩 ...

  8. KMP单模快速字符串匹配算法

    KMP算法是由Knuth,Morris,Pratt共同提出的算法,专门用来解决模式串的匹配,无论目标序列和模式串是什么样子的,都可以在线性时间内完成,而且也不会发生退化,是一个非常优秀的算法,时间复杂 ...

  9. 【原创】通俗易懂的讲解KMP算法(字符串匹配算法)及代码实现

    一.本文简介 本文的目的是简单明了的讲解KMP算法的思想及实现过程. 网上的文章的确有些杂乱,有的过浅,有的太深,希望本文对初学者是非常友好的. 其实KMP算法有一些改良版,这些是在理解KMP核心思想 ...

随机推荐

  1. Class<T> 泛型获取T的class

    getClass().getGenericSuperclass()返回表示此 Class 所表示的实体(类.接口.基本类型或 void)的直接超类的 Type然后将其转换ParameterizedTy ...

  2. USACO 2009 Open 干草塔 Tower of Hay(贪心+单调队列优化DP)

    https://ac.nowcoder.com/acm/contest/1072/B Description 为了调整电灯亮度,贝西要用干草包堆出一座塔,然后爬到牛棚顶去把灯泡换掉.干草包会从传送带上 ...

  3. 如何将jar包打包到本地maven仓库

    --例如下载jar到本地(例如经常用到的oracle数据库驱动) --前提本地已将安装maven并配置好环境,cmd并切换到jar包的文件夹下,执行以下命令,注意DgroupId.DartifactI ...

  4. [LC] 452. Minimum Number of Arrows to Burst Balloons

    There are a number of spherical balloons spread in two-dimensional space. For each balloon, provided ...

  5. RegexUtil

    package org.linlinjava.litemall.core.util; import java.util.ArrayList; import java.util.Collections; ...

  6. python3多线程应用详解(第二卷:多线程到底是怎么工作的)

    现在很多人都说用多线程工作快是因为多个不同任务可以同时执行,注意我说的是不同任务,要是重复做一件事达到相同效果就是画蛇添足了,其实这是个错误的说法,线程真正的本质是无法同时执行的.现在我们来看下多线程 ...

  7. [LC] 8. String to Integer (atoi)

    Implement atoi which converts a string to an integer. The function first discards as many whitespace ...

  8. 从CVPR 2014看计算机视觉领域的最新热点

    2014看计算机视觉领域的最新热点" title="从CVPR 2014看计算机视觉领域的最新热点"> 编者按:2014年度计算机视觉方向的顶级会议CVPR上月落下 ...

  9. js原型理解

    https://www.cnblogs.com/liuhw/p/10646717.html __proto__的默认指向:https://www.jianshu.com/p/686b61c4a43d

  10. java 使用poi导入Excel通用方法

    需要的jar: [XML] 纯文本查看 复制代码 ? 1 2 3 4 5 <dependency>             <groupId>org.apache.poi< ...