C语言实现BF算法案例详解

BF算法:

       BF算法即暴风算法,是普通的模式匹配算法。BF算法的思想:将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。

图示:

#include <stdio.h>
#include <string.h>

int BF(const char *s, const char* sub, int pos)//O(n*m)
{
	int i = pos;
	int j = 0;
	int lens = strlen(s);
	int lensub = strlen(sub);
	while (i<lens && j<lensub)
	{
		if (s[i] == sub[j])
		{
			i++;
			j++;
		}
		else
		{
			i = i - j + 1;//i退回到当前匹配失败初始的下一个
			j = 0;//j回退到0
		}
	}
	if (j >= lensub)
	{
		return i - j;
	}
	else
	{
		return -1;
	}
}

int main()
{
	char *s = "ababcabcdfabcde";
	char *sub = "abcd";
	printf("%d\n", BF(s, sub, 0));
	return 0;
}

到此这篇关于C语言实现BF算法案例详解的文章就介绍到这了,更多相关C语言实现BF算法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言实现九大排序算法的实例代码

    直接插入排序 将数组分为两个部分,一个是有序部分,一个是无序部分.从无序部分中依次取出元素插入到有序部分中.过程就是遍历有序部分,实现起来比较简单. #include <stdio.h> void insertion_sort(int arr[], int array_length) { for (int i = 0; i < array_length; ++i) { int data = arr[i]; int j = 0; while (arr[j] < arr[i]) { j

  • c语言中使用BF-KMP算法实例

    直接上代码 复制代码 代码如下: #define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<string.h> #define MAX_SIZE 255    //定义字符串的最大长度 typedef unsigned char SString[MAX_SIZE];//数组第一个保存长度//BFint BFMatch(char *s,char *p){    int i,j;  

  • C语言的10大基础算法

    算法是一个程序和软件的灵魂,作为一名优秀的程序员,只有对一些基础的算法有着全面的掌握,才会在设计程序和编写代码的过程中显得得心应手.本文是近百个C语言算法系列的第二篇,包括了经典的Fibonacci数列.简易计算器.回文检查.质数检查等算法.也许他们能在你的毕业设计或者面试中派上用场. 1.计算Fibonacci数列 Fibonacci数列又称斐波那契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21. C语言实现的代码如下: /* Displaying Fibona

  • C语言实现经典24点算法

    本文实例为大家分享了C语言经典24点算法的具体实现代码,供大家参考,具体内容如下 1.概述 给定4个整数,其中每个数字只能使用一次:任意使用 + - * / ( ) ,构造出一个表达式,使得最终结果为24,这就是常见的算24点的游戏.这方面的程序很多,一般都是穷举求解.本文介绍一种典型的算24点的程序算法,并给出两个具体的算24点的程序:一个是面向过程的C实现,一个是面向对象的java实现. 2.基本原理 基本原理是穷举4个整数所有可能的表达式,然后对表达式求值. 表达式的定义: express

  • C语言使用Bresenham算法生成直线(easyx图形库)

    Bresenham算法是计算机图形学领域使用最广泛的直线扫描转换方法. 其原理是:过各行.各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线各垂直网格线的交点,然后确定该列像素中与此交点最近的像素. Bresenham算法也是一种计算机图形学中常见的绘制直线的算法,其本质思想也是步进的思想,但由于避免了浮点运算,相当于DDA算法的一种改进算法. 源代码展示: #include<stdio.h> #include<graphics.h> #include<math

  • C语言实现页面置换 先进先出算法(FIFO)

    本文实例为大家分享了C语言实现页面置换算法的具体代码,供大家参考,具体内容如下 一.设计目的 加深对请求页式存储管理实现原理的理解,掌握页面置换算法中的先进先出算法. 二.设计内容 设计一个程序,有一个虚拟存储区和内存工作区,实现下述三种算法中的任意两种,计算访问命中率(命中率=1-页面失效次数/页地址流长度).附加要求:能够显示页面置换过程. 该系统页地址流长度为320,页面失效次数为每次访问相应指令时,该指令对应的页不在内存的次数.    程序首先用srand()和rand()函数分别进行初

  • C语言的进制转换及算法实现教程

    1.其他进制转十进制 1.1.二进制转十进制 转换规程: 从最低位开始,将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和,例如: 二进制 1011 = 1*2^0 + 1*2^1 + 0*2^2 + 1*2^3 = 1 + 2 + 0 + 8 = 11 1.2.八制转十进制 转换规则: 从最低位开始,将每个位上的数提取出来,乘以8的(位数-1)次方,然后求和,例如: 八进制 0123 = 3*8^0 + 2*8^1 + 1*8^2 = 3+16+64 = 83 1.3.十六进制转十进制

  • C语言实现BF算法案例详解

    BF算法:        BF算法即暴风算法,是普通的模式匹配算法.BF算法的思想:将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果.BF算法是一种蛮力算法. 图示: #include <stdio.h> #include <string.h> int BF(const char *s, const char* sub, int pos)//

  • C语言之system函数案例详解

    来看看在windows操作系统下system () 函数详解(主要是在C语言中的应用) 注意:在windows下的system函数中命令可以不区别大小写! 函数名: system 功 能: 发出一个DOS命令 用 法: int system(char *command); system函数已经被收录在标准c库中,可以直接调用. 例如: #include<stdio.h> #include<stdlib.h> int main() { printf("About to sp

  • Java DFA算法案例详解

    1.背景 项目中需要对敏感词做一个过滤,首先有几个方案可以选择: 直接将敏感词组织成String后,利用indexOf方法来查询. 传统的敏感词入库后SQL查询. 利用Lucene建立分词索引来查询. 利用DFA算法来进行. 首先,项目收集到的敏感词有几千条,使用a方案肯定不行.其次,为了方便以后的扩展性尽量减少对数据库的依赖,所以放弃b方案.然后Lucene本身作为本地索引,敏感词增加后需要触发更新索引,并且这里本着轻量原则不想引入更多的库,所以放弃c方案.于是我们选定d方案为研究目标. 2.

  • C语言 sockaddr和sockaddr_in案例详解

    struct sockaddr 和 struct sockaddr_in 这两个结构体用来处理网络通信的地址. 一.sockaddr sockaddr在头文件#include <sys/socket.h>中定义,sockaddr的缺陷是:sa_data把目标地址和端口信息混在一起了,如下: struct sockaddr { sa_family_t sin_family;//地址族 char sa_data[14]; //14字节,包含套接字中的目标地址和端口信息 }; 二.sockaddr_

  • C语言container of()函数案例详解

          在linux 内核编程中,会经常见到一个宏函数container_of(ptr,type,member), 但是当你通过追踪源码时,像我们这样的一般人就会绝望了(这一堆都是什么呀? 函数还可以这样定义??? 怎么还有0呢???  哎,算了,还是放弃吧...). 这就是内核大佬们厉害的地方,随便两行代码就让我们怀疑人生,凡是都需要一个过程,慢慢来吧.         其实,原理很简单:  已知结构体type的成员member的地址ptr,求解结构体type的起始地址.        

  • C语言MultiByteToWideChar和WideCharToMultiByte案例详解

    目录 注意: 一.函数简单介绍 ( 1 ) MultiByteToWideChar() ( 2 ) WideCharToMultiByte() 二.使用方法 ( 1 ) 将多字节字符串转为宽字符串: ( 2 ) 从宽字节转为窄字节字符串 三.MultiByteToWideChar()函数乱码的问题 注意: 这两个函数是由Windows提供的转换函数,不具有通用性 C语言提供的转换函数为mbstowcs()/wcstombs() 一.函数简单介绍 涉及到的头文件: 函数所在头文件:windows.

  • C语言 联合(union)用法案例详解

    联合(union)的声明和结构与结构体类似,但是本质不同.    联合的所有成员引用的是内存中的相同位置.当你想在不同时刻把不同的东西存储于同一位置时,就可以使用联合.   构体(struct)中所有变量是"共存"的--优点是"有容乃大",全面:缺点是struct内存空间的分配是粗放的,不管用不用,全分配.   而联合体(union)中是各变量是"互斥"的--缺点就是不够"包容":但优点是内存使用更为精细灵活,也节省了内存空间

  • JVM中四种GC算法案例详解

    目录 介绍 引用计数算法(Reference counting) 算法思想: 核心思想: 优点: 缺点: 例子如图: 标记–清除算法(Mark-Sweep) 算法思想: 优点 缺点 例子如图 标记–整理算法 算法思想 优点 缺点 例子 复制算法 算法思想 优点 缺点 总结 介绍 程序在运行过程中,会产生大量的内存垃圾(一些没有引用指向的内存对象都属于内存垃圾,因为这些对象已经无法访问,程序用不了它们了,对程序而言它们已经死亡),为了确保程序运行时的性能,java虚拟机在程序运行的过程中不断地进行

  • Python 经典贪心算法之Prim算法案例详解

    最小生成树的Prim算法也是贪心算法的一大经典应用.Prim算法的特点是时刻维护一棵树,算法不断加边,加的过程始终是一棵树. Prim算法过程: 一条边一条边地加, 维护一棵树. 初始 E = {}空集合, V = {任选的一个起始节点} 循环(n – 1)次,每次选择一条边(v1,v2), 满足:v1属于V , v2不属于V.且(v1,v2)权值最小. E = E + (v1,v2) V = V + v2 最终E中的边是一棵最小生成树, V包含了全部节点. 以下图为例介绍Prim算法的执行过程

  • Go语言文件读写操作案例详解

    目录 基本介绍 文件基本操作 读操作 写操作 写操作案例 查看文件或目录是否存在 拷贝文件 基本介绍 文件,对我们并不陌生,文件是数据源(保存数据的地方)的 一种 输入流和输出流 文件在程序中是以流的形式来操作的 流:数据在数据源(文件)和程序(内存)之间经历的路径 输入流:数据从文件到内存的路径 输出流:数据从内存到文件的路径 os.File封装所有文件相关操作,File是一个结构体 文件基本操作 读操作 package main import ( "bufio" "fmt

随机推荐