模式匹配-BF算法

/***字符串匹配算法***/
#include<cstring>
#include<iostream>
using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
#define MAXSTRLEN 255   		//用户可在255以内定义最长串长
typedef char SString[MAXSTRLEN+1];		//0号单元存放串的长度

Status StrAssign(SString T, char *chars) { //生成一个其值等于chars的串T
	int i;
	if (strlen(chars) > MAXSTRLEN)
		return ERROR;
	else {
		T[0] = strlen(chars);
		for (i = 1; i <= T[0]; i++)
			T[i] = *(chars + i - 1);
		return OK;
	}
}

//填写4.1 BF算法
int Index(SString S, SString T, int pos)
{
	//返回模式T在主串S中第pos个字符之后第s一次出现的位置。若不存在,则返回值为0
	//其中,T非空,1≤pos≤StrLength(S)
	int i=pos;
	int j=1;
	while(i<=S[0]&&j<=T[0])
	{
		if(S[i]==T[j])
		{
			i++;
			j++;
		}
		else
		{
			i=i-j+2;
			j=1;
		}
	}
	if(j>T[0])  return i-T[0];
	else        return 0;
}//Index

int main()
{
	SString S;
	StrAssign(S,"bbaaabbaba");
	SString T;
	StrAssign(T,"abb") ;
	cout<<"主串和子串在第"<<Index(S,T,1)<<"个字符处首次匹配\n";
	return 0;
}

时间: 2024-11-07 19:53:09

模式匹配-BF算法的相关文章

简单易懂的KMP,NEXT数组,BF算法(实例讲解)!!!

去了360面试,问了一个关于KMP的知识点,呀,完全忘了啊,太不应该了,然后就打算看看这个KMP,,, 看了好多关于KMP算法的书籍和资料,总感觉没有说的很清楚,为什么会产生next数组,为什么给出了那么简短的程序,没有一个过程,而有的帖子虽然next及其字符串匹配说的很清楚,但是推理的一些过程相当复杂,比较抽象,今天在这里简单的提一下我的理解,尽可能的把这个过程讲的简单,容易理解 从模式匹配之初:我们先是研究的是BF算法,鉴于我们经常行的需要回溯,总是做一些无用功,为了提高算法的时间度和空间度

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

串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3--.an ' n = 0时为空串串的顺序存储结构:字符数组,串的长度就是数组末尾'\0'前面的字符个数数组需在定义时确定长度,有局限性数组的最大长度二:串的堆分配存储表示typedef struct { char *ch; //若是非空串,则按串长分配存储区 //否则ch为空 int length; //串长度}HS

5月15日(链串中截取子串和BF算法)

BF算法属于一种蛮力算法,用来查找子串在串中的位置. // 截取子串 int getsstring(linkstr *s,char ch[],int k,int n){ linkstr *sl; sl = s; if(k<0 || n<0) return -1; for(int i = 0; i<k ;i++){ sl = sl->next; } for(int j; j<n; j++){ ch[j] = sl->ch; sl = sl->next; } retu

BF算法(蛮力匹配)

输入主串a,模式b b在a中的位置 1.在串a和串b中设置比较的下标i=0,j=0: 2.重复下述操作,直到a或b的所有字符均比较完毕: 2.1如果a[i]等于b[i],继续比较a和b的下一对字符: 2.2负责,下标i和j分别回溯,开始下一趟匹配: 3.如果b中所有字符均比较完,则匹配成功,返回本趟匹配的起始位置:负责匹配失败,返回0: #include<iostream> #define N 100000 using namespace std; char a[N],b[N]; int BF

字符串与模式匹配算法(一):BF算法

一.BF算法的基本思想 BF(Brute Force)算法是模式匹配中最简单.最直观的算法.该算法最基本的思想是从主串的第 start 个字符起和模式P(要检索的子串)的第1个字符比较,如果相等,则逐个比较后续字符:比较过程中一旦发现不相等的情况,则回溯到主串的第 start+1 个字符位置,重新和模式P的字符进行比较. 二.算法代码 1 package algorithm; 2 3 import java.util.Scanner; 4 5 /** 6 * 字符串匹配算法:BF 7 */ 8

BF算法与KMP算法

BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果. BF算法实现: 1 int BF(char S[],char T[],int pos) 2 {//c从第pos位开始搜索匹配 3 int i=pos,j=0; 4 while(S[i+j]!='\0'&&T[j]!='\0')

BF算法

BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符:若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果. 1 //BF算法 2 #include <iostream> 3 4 using namespace std; 5 6 int main(){ 7 char dst[] = "ababa"; 8 char src[] = "ab

模式匹配- KMP算法

■Knuth-Morris-Pratt(KMP)算法-听我的,别总重来. 发表于1977年的KMP算法是一种高效的匹配算法,消除了BF算法中回溯问题,即每次移动的距离可以不是1而是更大的数,也不需要回溯,BF算法的时间复杂度是O(m*n),而KMP算法的时间复杂度是O(m+n). 在BF算法中,用模式串去和目标串比较时,如果发生不匹配,就要回溯到起始位置,然后后移.KMP算法的思想是,设法利用这个已知信息,跳过前面已经比较过的位置,继续把它向后移,从而提高效率. 这样,KMP算法有以下两个要点:

模式匹配—KMP算法中Next值求解

#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct { char *ch; int length; }HString; void StrAssign(HString &T,char chars[]); int get_next(HString T,int next[]); void main() { HString T; char chars[80]; int i,n,ne