ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

BF算法和KMP算法

2021-12-04 14:02:26  阅读:277  来源: 互联网

标签:主串 BF int KMP pos next 算法 printf SString


 总结:

1.KMP算法和BF算法很相似,区别在于KMP算法的主串 i 值不用回溯,匹配到哪就是哪,模式串的 j 值不是回到 1 ;而是回到 next[ j ]. 

2.next[ j ]数组是什么呢?

 3.next 函数还是不太会,需要后续有时间加强学习!!!

#include<stdio.h>
#include<stdlib.h>
#include<stdio.h>
#include<stdlib.h>
#define MAXLEN 255
#define OK 1
#define ERROR 0
#define OVERFLOW -2
int i, n, j, x;
char e;
int next[255];
//顺序存储串
typedef struct {
	char ch[MAXLEN + 1];//存储串的一维数组  ch[0]闲置不用,从[1]开始到[255]来存放字符。
	int length;//串当前长度
}SString;
//串赋值
int StringAssign(SString& S, char chs[]) {//生成一个其值等于字符串常量chs的串S
	int i = 0;
	while (chs[i] != '\0') {//循环,将字符串常量的值赋值给S
		S.ch[i + 1] = chs[i];//S.ch数组从下标为1开始存放
		++i;
	}
	S.length = i;//将i赋值给S的长度
	return 0;
}


//BF算法
int Index_BF(SString& S, SString& T, int pos) {
	//S是主串,T是模式串,pos是主串开始匹配的位置
	int i = pos; int j = 1;
	while (i <= S.length && j <= T.length) {
//循环结束条件就是要么主串没有和模式串匹配的那一段,
//要么就是匹配成功,j到了模式串最后一位的下一位置
		if (S.ch[i] == T.ch[j]) {
			i++;
			j++;
		}
		else {
			i = i - j + 2;//可以理解为i= (i-j+1)+1,(要先知道,
              //  串里面的数组下标为0的地方是不放元素的,所以i是从1开始算起的)
			//意思就是主串的i回到出发的位置,然后要让i+1,
        // 就是让i从开始的位置的下一个位置开始往后匹配。
			j = 1;//让j回到第一个位置
		}
	}
	if (j > T.length) {//匹配成功
		printf("\n匹配成功!");
		printf("\n模式串匹配成功的位置为%d.", i - T.length);

		return OK;//返回的就是模式串的第一个元素的下标(也是位置),
             //因为数组第一位不存元素,所以下标等于位置
	}
	else {
		printf("\n匹配不成功!");
		return ERROR;
	}
}
//KMP算法
int Index_KMP(SString& S, SString& T, int pos) {
	//S是主串,T是模式串,pos是主串开始匹配的位置
	int i = pos; int j = 1;
	while (i <= S.length && j <= T.length) {//循环结束条件就是要么主串没有和模式串匹配的那一段,
//要么就是匹配成功,j到了模式串最后一位的下一位置
		if (j==0 || S.ch[i] == T.ch[j]) {
			i++;
			j++;
		}
		else {
			j = next[j];
		}
	}
	if (j > T.length) {//匹配成功
		printf("\n匹配成功!");
		printf("\n模式串匹配成功的位置为%d.", i - T.length);

		return OK;//返回的就是模式串的第一个元素的下标(也是位置),
//因为数组第一位不存元素,所以下标等于位置
	}
	else {
		printf("\n匹配不成功!");
		return ERROR;
	}
}
//next[j]函数

void get_next(SString &T, int next[]) {
	i = 1; next[1] = 0; j = 1;
	while (i < T.length) {
		if (j == 0 || T.ch[i] == T.ch[j]) {
			++i; ++j;
			next[i] = j;
		}
		else {
			j = next[j];
		}
	}
}
int main() {
	SString S;
	SString T;
	char ch1[25555];//定义一个数组,等下来放入主串
	char ch2[255];//放入模式串
	printf("==============BF算法================\n");
	printf("请输入主串:");
	scanf("%s", &ch1);
	StringAssign(S, ch1);//引用此函数,可以把数组ch1的元素放进S.ch,作为主串

	printf("\n请输入模式串:");
	scanf("%s", &ch2);
	StringAssign(T, ch2);

	int pos = 1;//表示从第pos个元素开始查找
	Index_BF(S, T, pos);//BF算法函数

	printf("\n==============KMP算法================\n");
	SString S1;
	SString T1;
	char ch3[255];//定义一个数组,等下来放入主串
	char ch4[255];//放入模式串
	printf("请输入主串:");
	scanf("%s", &ch3);
	StringAssign(S1, ch3);

	printf("\n请输入模式串:");
	scanf("%s", &ch4);
	StringAssign(T1, ch4);
	printf("模式串的next数组为:");
	get_next(T1, next);
	for (i = 0; i < T1.length; i++) {
		printf("%d", next[i]);
	}

	Index_KMP(S1, T1, pos);
	return 0;
}

标签:主串,BF,int,KMP,pos,next,算法,printf,SString
来源: https://blog.csdn.net/weixin_48420408/article/details/121714883

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有