串的模式匹配算法

子串(模式串)的定位操作通常称为串的模式匹配。

这是串的一种重要操作,很多 软件,若有“编辑”菜单项的话, 则其中必有“查找”子菜单项。

串的顺序存储实现

#include<stdio.h>
#include<string.h>
#define MaxLen 256 /*定义能处理的最大的串长度*/
typedef struct {
char str[MaxLen];
int curlen; /*定义当前实际串长度*/
}SString;

BF算法设计思想:

  • 将主串的第pos个字符和模式的第1个字符比较, 若相等,继续逐个比较后续字符; 若不等,从主串的下一字符(pos+1)起,重新与第一个字符比较。
  • 直到主串的一个连续子串字符序列与模式相等 。返回值为S中与T匹配的子序列第一个字符的序号,即匹配成功。

  • 否则,匹配失败,返回值 0
int Index(SString *s,SString *t)
{ * 返回子串t在主串s中的位置。若不存在,则函数值为-*/
int i,j; i=; j=;
while(i<s->curlen &&j<t->curlen) {
if(s->str[i]==t->str[j])
{ i++; j++; }
else /* 指针后退重新开始匹配 */
{ i=i-j+; j=; }
}
if(j>=t->curlen)
return i-t->curlen+;
else
return -;
}

若n为主串长度,m为子串长度,则串的BF匹配算法最坏的情况下需要比较字符的总次数为:

最恶劣情况是:主串前面n-m个位置都部分匹配到子串的最后一位,即这n-m位比较了m次.

但一般情况下BF算法的时间复杂度为O(n+m)

模式匹配的一种改进算法——KMP

KMP算法的基本思想:每一趟匹配完成后,利用上一趟匹配的结果,将模式向右滑动尽可能远的一段距离。

其方法是:不回溯指针i,找出主串中第i个字符应和模式串的第几个字符比较。

显然next[j]只与模式串有关,与主串无关

KMP算法实现

int Index_KMP(SString *s, SString *t)
{
int next[],i=,j=,v;
getnext(t,next);/*先求得模式串的next函数值*/
while(i<s->curlen && j<t->curlen){
if(j==- || s->str[i]==t->str[j])
{ i++; j++;}
else j=next[j]; /*i不变,j回退*/
}
if(j>=t->curlen)
v=i-t->curlen+; /*匹配成功*/
else
v=-; /*匹配失败*/
return v;
}

求next:

void getnext(SString *t, int *next)
{ /*串t即作为目标串又作为模式串*/
int j,k;
j=;k=-;next[]=-;
while(j<t->curlen-) {
if(k==-||t->str[j]==t->str[k]) {
j++;k++;
if(t->str[j]!=t->str[k])
next[j]=k;
else
next[j]=next[k];
}
else k=next[k];
}
}

推荐参考:

http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

Boyer-Moore 字符串匹配算法
https://www.cnblogs.com/gaochundong/p/boyer_moore_string_matching_algorithm.html

数据结构与算法5—KMP算法的更多相关文章

  1. hdu 3336:Count the string(数据结构,串,KMP算法)

    Count the string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. 数据结构之BF算法,kmp算法,三元组,十字链表总结

    在这一章中,老师教了我们四种数据结构:BF算法,kmp算法,三元组和十字链表:还给我们讲了2019年团体天体赛中T1-8的AI题 1.对于BF和kmp算法,老师除了在课堂上讲解算法的主要核心思想外,还 ...

  3. 算法:KMP算法

    算法:KMP排序 算法分析 KMP算法是一种快速的模式匹配算法.KMP是三位大师:D.E.Knuth.J.H.Morris和V.R.Pratt同时发现的,所以取首字母组成KMP. 少部分图片来自孤~影 ...

  4. BF算法与KMP算法

    BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的 ...

  5. 算法 | 串匹配算法之KMP算法及其优化

    主串 s:A B D A B C A B C 子串 t:  A B C A B 问题:在主串 s 中是否存在一段 t 的子串呢? 形如上述问题,就是串匹配类问题.[串匹配--百度百科] 串匹配问题是一 ...

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

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

  7. KMP算法及KMP算法的应用(POJ2406)

    ///KMP算法#include<bits/stdc++.h> using namespace std; ]; void makeNext(const char P[],int next[ ...

  8. 什么是KMP算法?KMP算法推导

    花了大概3天时间,了解,理解,推理KMP算法,这里做一次总结!希望能给看到的人带来帮助!! 1.什么是KMP算法? 在主串Str中查找模式串Pattern的方法中,有一种方式叫KMP算法 KMP算法是 ...

  9. 串、串的模式匹配算法(子串查找)BF算法、KMP算法

    串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3…….an ' n ...

随机推荐

  1. UFUN函数 UF_UI UF_PART函数(UF_UI_select_with_class_dialog, UF_PART_export_with_options)

    /*主要演示 UF_PART_export_with_options 这个函数 */1 //设置class_dialog选择过滤 static int init_proc(UF_UI_selectio ...

  2. DIV 始终位于文档底部

    DIV 始终位于文档底部 设置body为绝对定位,最小显示高度为:100%,宽度为:100%: 设置底部显示块为绝对定位,bottom: 0,是body元素的最后一个直接子元素: 设置底部块元素同级元 ...

  3. [PHP] Layui + jquery 实现 实用的文章自定义标签

    先看实现效果: html 代码如下: <!doctype html> <html> <head> <meta charset="utf-8" ...

  4. ORM属性/字段

    一. ORM字段   (models.py文件中创建类,继承models.Model) class Book(models.Model):  # 书籍列表 bid=models.AutoField(p ...

  5. bzoj2916: [Poi1997]Monochromatic Triangles 思路

    bzoj2916: [Poi1997]Monochromatic Triangles 链接 bzoj 思路 总方案\(C_{n}^{3}-异色三角形\) 异色三角形有个特点. 会出现两个点有两条不同色 ...

  6. 【border树】【P2375】动物园

    Description 给定一个字符串 \(S\),对每个前缀求长度不超过该前缀一半的公共前后缀个数. 共有 \(T\) 组数据,每组数据的输出是 \(O(1)\) 的. Limitations \( ...

  7. SOA & 微服务

    参考文档: https://www.cnblogs.com/renzhitian/p/6853289.htmlhttp://www.jdon.com/soa.htmlhttps://www.ibm.c ...

  8. Prometheus 介绍

    我们知道zabbix在监控界占有不可撼动的地位,功能强大.但是对容器监控显得力不从心.为解决监控容器的问题,引入了prometheus技术.prometheus号称是下一代监控.接下来的文章打算围绕p ...

  9. 注意:MagickReadImageBlob() 引发的问题

    今天发现: 如果之前的 mw 已加载了具体的图片数据后,再对这个 mw 进行: MagickReadImageBlob(mw, data, dataLen) 程序运行发生了崩溃. 最后找到原因: Ma ...

  10. Spring+Spring+Hibernate环境搭建

    源码地址:https://gitee.com/kszsa/ssht.git 一.引入lib包 pom.xml,引入需要的jar包 <?xml version="1.0" en ...