字符串匹配——朴素算法Brute-Force(布鲁特-福斯算法)

布鲁特-福斯算法

简单的模式匹配算法是一种带回溯的匹配算法。

一.算法思想

从主串S的第pos个字符开始,和模式串T的第一个字符开始比较,如果相等就继续比较后续字符,如果不等,则从(回溯到)主串S的第pos+1个字符开始重新和模式串T进行比较,直到模式串T中的每一个字符和主串的每一个连续字符子序列全部相等,则称匹配成功,返回和T第一个字符相等的字符在主串S中的位置;或者主串中没有和模式串相等的字符序列,则称匹配不成功。

二.算法实现代码

设置i,j,start三个指示器:

i——指向主串S中当前比较的字符,起始指向S的首字符,此后每比较一步,后移一个位置,一趟匹配失败时,回溯到该趟比较起点的下一个位置。

j——指向子串T中当前比较的字符,起始指向T的首字符,此后每比较一步,后移一个位置,一趟匹配失败时,回溯到T的首字符处。

start——记录每趟比较时在主串S中的起始位置,每趟比较后,后移一个位置,以便确定下一趟的起始位置。

#include <stdio.h>
#include "SstringHeader.h "

/*主串S,模式串T*/
int navie_string_matcher(SString s,int pos,SString t)
{
    int i,j,start;
    start = pos; i = start; j = 0;/*主串从pos开始,模式串从头开始*/
    if (t.len==0) return 0; /*模式串为空串时,是任意串的匹配串*/
    while (i < s.len && j < t.len )
        if (s.ch[i]==t.ch[j])/*当前对应字符相等时推进*/
        {
            i++;
            j++;
        }
        else
        {
            start++;  /*对应字符不等时回溯*/
            i = start;/*主串从start+1开始,模式串从头(0)开始*/
            j =0;
        }
        if (j >= t.len) return(start); /*匹配成功时返回匹配起始位置*/
        else return -1;    /*匹配不成功时,返回-1*/

}

算法实现结果截图:

三.算法实现举例

主串S:a b a b c a b c a c b a b

子串T:a b c a c

pos = 0; start = pos=0;i=start = 0;j=0;

s.len = 13; t.len=5分别为字符串s,t的长度

while (i < s.len && j < t.len )
        if (s.ch[i]==t.ch[j])/*当前对应字符相等时推进*/
        {
            i++;
            j++;
        }
        else
        {
            start++;  /*对应字符不等时回溯*/
            i = start;/*主串从start+1开始,模式串从头(0)开始*/
            j =0;
        }

(1) i=0;j=0;i<13&&j<5为真

if( s.ch[i]==t.ch[j]),即判断s.ch[0]==t.ch[0],s.ch[0]=a,t.ch[0]=a,为真,

i++;j++;

i=1;j=1;

i=1;j=1;也满足字符匹配;

i=2;j=2时,s.ch[2]=a,t.ch[2]=c

(2)start=1,i=1,j=0;过程同上,只给出匹配结果图:

(3)start=2,i=2;j=0;

(4)start=3;i=3;j=0;

(5)start=4;i=4;j=0;

(6)start=5;i=5;j=0;

j=5,while循环不满足;

执行

if (j >= t.len) return(start); /*匹配成功时返回匹配起始位置*/

返回start=5;

四.算法复杂度分析

算法的最坏时间复杂度为O((s.len-t.len+1)*t.len)

Reference:

《数据结构——用C语言描述》,耿国华著 . 4.2串的存储实现

时间: 2024-11-08 16:55:45

字符串匹配——朴素算法Brute-Force(布鲁特-福斯算法)的相关文章

【算法视频】字符串模式匹配--布鲁特.福斯算法

2.4.字符串模式匹配 资讯网址:www.qghkt.com 腾讯课堂:https://qghkt.ke.qq.com/20个常用算法 模式串(或子串)在主串中的定位操作通常称为串的模式匹配,它是各种串处理系统中最重要的运算之一. 2.4.1.布鲁特-福斯算法 [基本思想] 从主串的第一个字符起与模式串的第一个字符比较,若相等,则继续逐个字符进行后续比较,否则从主串的第二个字符起与模式串的第一个字符重新开始比较,直至模式串中每个字符依次与主串中的一个连续的字符序列相等时为止,此时称为匹配成功:如

字符串匹配——朴素算法、KMP算法

字符串匹配(string match)是在实际工程中经常会碰到的问题,通常其输入是原字符串(String)和子串(又称模式,Pattern)组成,输出为子串在原字符串中的首次出现的位置.通常精确的字符串搜索算法包括朴素搜索算法,KMP, BM(Boyer Moore), sunday, robin-karp 以及 bitap.下面分析朴素搜索算法和KMP这两种方法并给出其实现.假设原字符T串长度N,子串P长度为M. 1.NAIVE-STRING-MATCHING. 朴素算法,该方法又称暴力搜索,

【算法】字符串匹配之Z算法

在很长一段时间,求文本与单模式串匹配,我只用KMP.后来我在CF上看到Z算法,用的人也不少.在学习之后,我感觉Z算法也是很精妙的.在以前的博文中也有过用Z算法来解决字符串匹配的题目. 下面介绍一下Z算法. 先一句话讲清楚Z算法能求什么东西. 输入为一个字符串s,Z算法可以求出这个字符串每一个后缀与自身的最长公共前缀LCP. 接下来,介绍Z算法的具体内容. 记字符串s的长度为n. Z算法需要维护一对值,记为left和right,简记为L和R.L和R满足s[L,R]为s串的前缀.当i为1的时候,暴力

【算法】利用有限自动机进行字符串匹配

1102. Strange Dialog Time Limit: 1.0 second Memory Limit: 16 MB One entity named "one" tells with his friend "puton" and their conversation is interesting. "One" can say words "out" and "output", besides h

朴素的字符串匹配

字符串匹配 朴素的字符串匹配 挨个扫描就完了,简直太他妈朴素了,就这我还没写出来,看了之后手法还是很精妙的 #include<iostream> using namespace std; int StrLen(const char* str){ const char* p = str; int i = 0; while(*p){ i++; p++; } return i; } const char* StrStr(const char* str1,const char* str2){ if(s

[CLRS][CH 32]字符串匹配

问题简介 对于给定文本 T[n] 和模式 P[m],找到一个位移量 s,使得 T[s + j] = P[j] (0 <= s <= n-m, 1 <= j <= m),则说明模式 P 在文本 T 中出现且位移为 s.所以字符串问题就是在给定文本 T 中,找出指定模式 P 出现的所有有效位移的问题. 记号和术语 长度为0的空字符串用 ? 表示.字符串 x 的长度用 |x| 表示.字符串 x, y 的连接表示为xy,长度为 |x|+|y|.对于字符串 x, y, w,如果 x = wy

数据结构与算法之美-字符串匹配(上)

BF (Brute Force) 暴力/朴素匹配算法 主串和模式串 我们在字符串 A 中查找字符串 B,那字符串 A 就是主串,字符串 B 就是模式串. 我们把主串的长度记作 n,模式串的长度记作 m.因为我们是在主串中查找模式串,所以 n>m. BF算法思想 在主串中,检查起始位置分别是 0.1.2-n-m 且长度为 m 的 n-m+1 个子串,看有没有跟模式串匹配的. BF算法的缺点 在极端情况下,如主串是"aaaaa-aaaaaa",模式串是"aaaaab&quo

字符串匹配与KMP算法笔记

>>字符串匹配问题 字符串匹配问题即在匹配串中寻找模式串是否出现, 首先想到的是使用暴力破解,也就是Brute Force(BF或蛮力搜索) 算法,将匹配串和模式串左对齐,然后从左向右一个一个进行比较, 如果不成功则模式串向右移动一个单位,直到匹配成功或者到达匹配串最后仍然不成功,返回失败. 很明显,这种算法有很多的地方可以优化,假设要搜索的串为S,长度为n,要匹配的串为M,长度为m,时间复杂度为O(nm). >>KMP算法 Knuth-Morris-Pratt算法以三个发明者命名

[算法系列之十二]字符串匹配之蛮力匹配

引言 字符串匹配是数据库开发和文字处理软件的关键.幸运的是所有现代编程语言和字符串库函数,帮助我们的日常工作.不过理解他们的原理还是比较重要的. 字符串算法主要可以分为几类.字符串匹配就是其中之一.当我们提到字符串匹配算法,最基本的方法就是所谓的蛮力解法,这意味着我们需要检查每一个文本串中的字符是否和匹配串相匹配.一般来说我们有文本串和一个匹配串(通常匹配串短于文本串).我们需要做的就是回答这个匹配串是否出现在文本串中. 概述 字符串蛮力匹配法的原理非常简单.我们必须检查匹配串的第一个字符与文本