C++实现:BF算法和KMP算法

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情
BF算法:
int BF_Find(string& s,string& t)
{
	int i=0,j=0,count=0;
	while(i<s.size())
	{
		
		if(s.at(i)==t.at(j))
		{
			i++;
			j++;
			count++;}
	   else
	   {
		   i++;
		   j=0;
		   count=0;
		}
		if(count==t.size())
		{
			cout<<"模式匹配成功,起始位置是:"<<i-count+1<<endl;
			return (i-count+1);
		}
	   
	}
    cout<<"字符串匹配失败!"<<endl;
	return 0;
}


改进后的BF算法效率更高即KMP算法:

void GetNext(string& s,int *next)
{
	int len = s.size();
     next[0] = 0;
     next[1] = 0;
     int i = 1;
     while(i < len - 1)
    {
            int j = next[i];

			while(j > 0 && s.at(j) != s.at(i)) j = next[j];

			if(s.at(j) == s.at(i))  next[i + 1] = j + 1;
            else next[i + 1] = j;

            i++;
      }



}

int KMP_Find(string& s,string&t) {  int i=0,j=0;  int n =t.size();  int *next = new int[n];  GetNext(t,next);  while(i<s.size()&&j<t.size())   {      if((j == 0)||(s.at(i)==t.at(j)))               {       i++;                   j++;               }               else               {                   j = next[j];               }    }

  if(j==t.size())   {    int index=i-t.size()+1;    cout<<"子串从长串的第"<<index<<"位开始匹配成功!"<<endl;     return index;   }      cout<<"字符串匹配失败!"<<endl;   return 0; }

测试代码:
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std; 
int _tmain(int argc, _TCHAR* argv[])
{
	string str1,str2;
	cout<<"请输入主串:"<<endl;
	cin>>str1;
	cout<<"请输入子串:"<<endl;
	cin>>str2;
	KMP_Find(str1,str2);
	return 0;
}


 

 

串的模式匹配算法BF算法详解 文章目录一、BF算法原理设计思想:二、时间复杂度三、C++实现代码 一、BF算法原理 BF算法是一种蛮力算法,其实现过程没有任何技巧,就是简单粗暴地拿一个串同另一个串中的字符一一比对,得到最终结果。 算法目的:确定主串中所含子串第一次出现的位置,这里的子串也称为模式串。 设计思想: (1)主串模式串逐个字符进行比较 (2)当出现字符不匹配(失配)时,主串的比较位置重置为起始位置的... 阅读详情

相关推荐

字符串匹配原理及实现C++版)

字符串匹配原理及实现C++版)1. 字符串匹配概念2. BF3. KMP4. BM5. 性能总结 1. 字符串匹配概念 2. BF 3. KMP 4. BM 5. 性能总结

九霄星河的博客 1万+

BF算法详解及C++实现

综上所述,BF算法是一种简单直接的搜索算法,适用于小规模问题或作为其他算法的基础实现。虽然BF算法在时间空间效率上不如其他高级算法,但在某些小规模问题或作为其他算法的基础实现时仍然具有一定的价值。对于每个可能的解决方案,都检查其是否满足问题的要求,直到找到满足要求的解决方案或遍历完所有可能的情况。由于BF算法穷举所有可能的解决方案,因此在问题规模较大时,其时间复杂度通常较高,因为它需要检查每个可能的解决方案。函数的实现使用了两层嵌套循环,分别枚举所有可能的数对,并检查它们的是否等于目标值。

DevPhantom的博客 476

字符串匹配算法——BFKMP原理及实现

任务说明 给定主字符串S=“字符串匹配算法——BFKMP原理及实现”,我想知道S内是否包含副字符串T=“匹配算法”,并返回T的第一个元素“匹”在S内的位置。我们通常把主字符串称为目标串,将副字符串称为模式串。 本文主要利用BF算法以及KMP算法解决字符串匹配任务。 一、BF算法 首先,给定 “目标串” “模式串” 如下: 1.算法概述 BF算法的整体思路就是遍历,是一种穷举法的体现。从目标串S的的第一个字符起与模式串T的第一个字符比较。 若相等,则继续对字符进行后续的比较;否则主串从第二个字符起与模

qq_41658995的博客 950

C++实现BF算法——简单高效的字符串匹配算法

代码中,BF函数接收两个参数:主串s模式串t,分别代表要进行匹配的文本待匹配的字符。s.length()t.length()为字符串长度,ij分别是主串模式串中当前字符的索引。BF算法,也叫暴力匹配算法,是一种简单且容易实现的字符串匹配算法。通过此次代码实现,我们可以看出BF算法虽然时间复杂度高,但它容易实现且在小规模数据上表现良好。否则,i回退到上一个匹配的位置的下一个字符处,j重置为0。在main函数中,我们将字符串st作为参数传递给BF函数,并输出匹配位置,即3。

Book_Sea的博客 456

BF算法----c++

BF算法

m0_64878682的博客 484

C++实现BF算法

代码C++实现BF算法

m0_53472091的博客 1240

串(BF ,KMP算法),数组,广义表

(1)串是内容受限的线性表,他限定了表中的元素为字符 1)BF算法 ①size()length()这两个函数是用来计算string类对象或者即STL对象方法。都是计算字符串长度。 ②strlen()是函数,参数必须是字符型指针(char),计算从开始到结束(’\0‘),返回的长度大小不包括’\0’,也是计算字符长度。 ③sizeof()是运算符,不能计算复杂内存分配空间大小。计算字符所占空间大小。* #include<stdio.h> #include<string> #inclu

opencv学习之霍夫变换检测同心圆 425

BFKMP算法(附自己写的源码)

BF爆破法,就是由两个指针一个一个进行比较,比较字符如果不是一样的,则主串指针退回到比较开始的下一个字符重新开始,子串指针回到字串第一位字符。KMP算法,则是在BF的基础上进行的优化,即比较字符的时候,上面的指针不动,下面指针归0,然后再进行比较。又考虑到可能有特殊情况,aaaabaaab这种类似刁民的东西。所以要专门准备一个函数,求这些K,制造一个next数组。假设上面是i,下面是j,下面比较的下标就是。K的意义是,父串子串前面有K个字符相等。:3个人总结的,所以是3个人的名字结合。

多方通行8的博客 274

BF算法KMP算法

BF算法 #include<iostream> #include<cstring> using namespace std; #define OK 1 #define ERROR 0 #define MAXSTRLEN 255 typedef char SString[MAXSTRLEN + 1]; //0号单元存放串的长度 int StrAssign(SString T, const char* chars) //生成一个其值等于chars的串T { if (strlen(ch

weixin_54418006的博客 467

C ++基础算法 | 串的模式匹配算法BFKMP

串的模式匹配 模式匹配是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配。假设P是给定的子串,T是待查找的字符串,要求从T中找出与P相同的所有子串,这个问题成为模式匹配问题。P称为模式,T称为目标。如果T中存在一个或多个模式为P的子串,就给出该子串在T中的位置,称为匹配成功;否则匹配失败。 朴素的模式匹配算法BF(BruteForce)算法) 朴素模式匹配算法的基本思想是穷举法,即就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若.

小麦China的博客 719

串匹配问题(BF算法+KMP算法完整代码)

串匹配问题(BF算法+KMP算法完整代码) //实验复习2(蛮力法:串匹配问题) //例子: 输入数据可使用S="ababcabccabcacbab",模式T="abcac"。 #include<stdio.h> #include<string.h> using namespace std; /*1.BF算法 //1)实现BF算法; 按照主串一次移动一个位置的挨个比较 主串模式串都要回溯,效率低 */ int BF(char S[],char T[]) { int

weixin_45939614的博客 1422

BFKMP算法

/***字符串匹配算法***/ #include #include using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; #define MAXSTRLEN 255     //用户可在255以内定义最长串长 typedef struct {  /

liuqi66的博客 559

大二数据结构(串与树的算法实现

串的算法实现一.BF算法二.KMP算法 一.BF算法 这个算法就是暴力枚举 可我写了好久 因为是字符串处理,我忘记了大一的时候应该加个 getchar(); 代码如下: #include <iostream> #include <bits/stdc++.h> using namespace std; #define MAXSIZE 10 typedef struct { char ch[MAXSIZE]; int length; }SString; //赋值函数 void A

沉晨尘宸的博客 258

字符串匹配 KMP BF

字符串匹配 KMP BF字符串匹配?BFKMP 字符串匹配? 简单的说就是: 给定两个字符串S, T 在主串S中找到模式T BF C++代码 /** * @brief brutal force 暴力 * * @param str 字符串 * @param pat 模式 * @return int 首字母下标或-1表示没找到 */ int bf(string str, string pat) { for (size_t i = 0; i < str.length(); i++) { s

m0_52313753的博客 783

算法KMP算法

int BF(char S[], char T[]) { int i = 0; int j = 0; while (S[i] != '\0' && T[j] != '\0') { if (S[i] == T[j]) { i++; j++; } else { i = i - j + 1;//ij同时回溯 j = 0; } } if (T[j] == '\0') return i - j; else return -1; .

weixin_58707952的博客 420

C++】【BF&KMP】字符串模式匹配,教材SStringstd::string(下标从1开始0开始)

C++KMPBF,下标

nyuXD的博客 927

字符串匹配问题———BF算法KMP算法

给定一个母串一个子串,在母串中找出子串出现的第一个位置 (字符串下标从0开始)。如果不存在,则返回 -1。

jsjsjejsj的博客 436

C++字符串匹配问题

BF算法的简单粗暴,缺点是每趟匹配不成功时,存在大量回溯,导致程序效率低下,而KMP算法充分利用了成功匹配部分的结果,保证了主串游标不回溯,通过模式串向右滑动代替模式串游标回溯,大大提高了程序运行效率。cout << "位置为(-1+1=0;表示不存在):" << weizhi << endl;cout << "重合位在(-1代表没有重合位): " << K << endl;KMP算法的时间复杂度为O(N+M),则BF算法的时间复杂度为O(N*M)。

stEthan的博客 396

BF KMP以及改进后的KMP

推荐大家看着三篇博客 https://blog.csdn.net/v_july_v/article/details/7041827 https://www.cnblogs.com/yjiyjige/p/3263858.html https://www.cnblogs.com/tangzhengyue/p/4315393.html BF #include &lt;iostream&gt;...

Geek_sun的博客 365
上一篇: C++实现:分数类
下一篇: C++文件操作
疯狂-的-蜗牛
博客等级 码龄16年 427粉丝 104原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值