模式匹配:从BF算法到KMP算法

模式匹配

子串的定位操作通常称为串的模式匹配。模式匹配的应用很常见,比如在文字处理软件中经常用到的查找功能。我们用如下函数来表示对字串位置的定位:

int index(const string &Tag,const string &Ptn,int pos)

其中,Tag为主串,Ptn为子串(模式串),如果在主串Tag的第pos个位置后存在与子串Ptn相同的子串,返回它在主串Tag中第pos个字符后第一次出现的位置,否则返回-1。

BF算法

我们先来看BF算法(Brute-Force,最基本的字符串匹配算法),BF算法的实现思想很简单:我们可以定义两个索引值i和j,分别指示主串Tag和子串Ptn当前正待比较的字符位置,从主串Tag的第pos个字符起和子串Ptn的第一个字符比较,若相等,则继续逐个比较后续字符,否则从主串Tag的下一个字符起再重新和子串Ptn的字符进行比较,重复执行,直到子串Ptn中的每个字符依次和主串Tag中的一个连续字符串相等,则匹配成功,函数返回该连续字符串的第一个字符在主串Tag中的位置,否则匹配不成功,函数返回-1。

用C++代码实现如下:

/*
返回子串Ptn在主串Tag的第pos个字符后(含第pos个位置)第一次出现的位置,若不存在,则返回-1
采用BF算法,这里的位置全部以从0开始计算为准,其中T非空,0<=pos<=Tlen
*/
int index(const string &Tag,const string &Ptn,int pos)
{
    int i = pos;  //主串当前正待比较的位置,初始为pos
    int j = 0;   //子串当前正待比较的位置,初始为0
    int Tlen = Tag.size();  //主串长度
    int Plen = Ptn.size();  //子串长度  

    while(i<Tlen && j<Plen)
    {
        if(Tag[i] == Ptn[j])   //如果当前字符相同,则继续向下比较
        {
            i++;
            j++;
        }
        else   //如果当前字符不同,则i和j回退,重新进行匹配
        {
            //用now_pos表示每次重新进行匹配时开始比较的位置,则
            //i=now_pos+后移量,j=0+后移量
            //则i-j+1=now_pos+1,即为Tag中下一轮开始比较的位置
            i = i-j+1;
            //Ptn退回到子串开始处
            j = 0;
        }
    }  

    if(j >= Plen)
        return i - Plen;
    else
        return -1;
}

调用上面的函数,采用如下代码测试:

int main()
{
    char ch;
    do{
        string Tag,Ptn;
        int pos;
        cout<<"输入主串:";
        cin>>Tag;
        cout<<"输入子串:";
        cin>>Ptn;
        cout<<"输入主串中开始进行匹配的位置(首字符位置为0):";
        cin>>pos;  

        int result = kmp_index(Tag,Ptn,pos);
        if(result != -1)
            cout<<"主串与子串在主串的第"<<result<<"个字符(首字符的位置为0)处首次匹配"<<endl;
        else
            cout<<"无匹配子串"<<endl;  

        cout<<"是否继续测试(输入y或Y继续,任意其他键结束):";
        cin>>ch;
    }while(ch == 'y' || ch == 'Y');
    return 0;
}

测试结果如下:

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索算法
, 字符串
, tag
, 位置
, 字符
, 模式
, 模式匹配算法
, 子串
, 字符串匹配算法
, BF算法
, 查找子串
BF
,以便于您获取更多的相关知识。

时间: 2024-10-03 04:13:35

模式匹配:从BF算法到KMP算法的相关文章

字符串的模式匹配详解--BF算法与KMP算法_C 语言

一.BF算法    BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符:若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果.    举例说明: S: ababcababa P: ababa BF算法匹配的步骤如下 i=0 i=1 i=2 i=3 i=4 第一趟:ababcababa 第二趟:ababcababa 第三趟:ababcababa 第四趟:ababcab

大话数据结构十一:字符串的模式匹配(KMP算法)

1. KMP算法简介: kmp算法是一种改进的字符串匹配算法,相比朴素算法,KMP算法预先计算出了一个哈希表,用来指导在匹配过程中匹配失败后尝试下次匹配的起始位置,以此避免重复的读入和匹配过程.这个哈希表被称为"部分匹配值表"(Particial match table),这种设计是KMP算法最精妙之处. 2. KMP算法分析: 下面以阮一峰老师博客中的一篇文章来分析KMP算法的原理:有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否

C语言kmp算法简单示例和实现原理探究_C 语言

以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下"奥,它是做模式匹配的"这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(下不说程序实现,思想很简单). 模式匹配的经典应用:从一个字符串中找到模式字串的位置.如"abcdef"中"cde"出现在原串第三个位置.从基础看起 朴素的模式匹配算法 A:abcdefg  B:cde 首先B从A的第一位开始比较,B++==A++,如果全

C++ KMP 算法

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特--莫里斯--普拉特操作(简称KMP算法). KMP算法的关键是根据给定的模式串W1,m,定义一个next函数,next函数包含了模式串本身局部匹配的信息. #include <iostream> #include <cstring> #include <string> #include <set> #include <ma

字符串查找算法总结(暴力匹配、KMP 算法、Boyer-Moore 算法和 Sunday 算法)

可进入我的博客查看原文. 字符串匹配是字符串的一种基本操作:给定一个长度为 M 的文本和一个长度为 N 的模式串,在文本中找到一个和该模式相符的子字符串,并返回该字字符串在文本中的位置. KMP 算法,全称是 Knuth-Morris-Pratt 算法,以三个发明者命名,开头的那个K就是著名科学家 Donald Knuth .KMP 算法的关键是求 next 数组.next 数组的长度为模式串的长度.next 数组中每个值代表模式串中当前字符前面的字符串中,有多大长度的相同前缀后缀. Boyer

字符串模式匹配之KMP算法图解与 next 数组原理和实现方案

之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下.   KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 i指针,而是利用已经得到的"部分匹配"的结果将模式子串向右"滑动"尽可能远的一段距离后,继续进行比较.如果 ok,那么主串的指示指针不回溯!算法的时间复杂度只和子串有关!很好. KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目

数据结构例程——串的模式匹配(KMP算法)

本文针对数据结构基础系列网络课程(4):串中第5课时串的模式匹配(KMP算法). 问题:串的模式匹配 KMP算法: #include <stdio.h> #include "sqString.h" void GetNext(SqString t,int next[]) /*由模式串t求出next值*/ { int j,k; j=0; k=-1; next[0]=-1; while (j<t.length-1) { if (k==-1 || t.data[j]==t.d

大话数据结构十:字符串的模式匹配(BF算法)

1. BF算法简介: BF(Brute Force)算法是普通的模式匹配算法,又称为朴素匹配算法或蛮力算法,该算法最大缺点就是字符匹配失败指针就要回溯,所以性能很低. 2. BF算法思想: 更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/ BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的第二个字符和P的第一个字符

KMP算法(转)

 KMP算法         在介绍KMP算法之前,先介绍一下BF算法. 一.BF算法     BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符:若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果.     举例说明:     S:  ababcababa     P:  ababa  BF算法匹配的步骤如下            i=0