# 学习以及成为想要成为的人day15

串的基本操作包括BF算法及KMP算法

写在前面

又过了很长一段时间,今天所幸有点成果了。这一段时间学的东西很杂,当然大部分是自学,关于JAVA的学习到了多线程开始停滞不前了,有了解到一个新的领域:网络安全的ctf大赛,目前对这个也很感兴趣,毕竟谁不想做一个酷帅的黑客呢。数据结构终于把串的基本操作实现了,其实看书的话,早就看到了二叉树。这个就不多赘述了。看代码吧!!!

代码实现

/*
C语言实现串的基本操作
包括BF算法和KMP算法
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#define OK 0
#define ERROR -1
#define MAXSIZE 100
typedef struct {//串的定长顺序存储结构
char ch[MAXSIZE+1];
int length;
}SString;
typedef struct {//串的堆式顺序存储结构
char *ch;
int length;
}HString;
int CreateString(HString *S,char *string){
int len=strlen(string);
S->ch=NULL;
S->length=0;
//初始化串
S->ch=(char*)malloc(sizeof(char)*len);
//动态分配len个内存空间
if(!S->ch){
printf("内存分配失败\n");
return ERROR;
}
for(int i=0;i<len;i++)
	S->ch[i]=string[i];
	S->length=len;
	return OK;
}
void DisplayString(HString *S){
	if(!S->length)
		printf("字符串为空\n");
	for(int i=0;i<S->length;i++)
		printf("%c",S->ch[i]);
	printf("\n");
}
int BF_Index(HString S,HString T,int pos){
/*字符串的暴力匹配算法
返回模式串T在主串S中第pos个字符第一次出现的位置
若不存在,则返回值为ERROR
其中T为非空,且1<=pos<=S.length
*/
int i=pos,j=1;
while(i<=S.length&&j<=T.length){
//当两个串均未到达串尾
	if(S.ch[i]==T.ch[j]){++i;++j;}//相等就继续比较后继字符
	else{i=i-j+2;j=1;}//不相等就后退重新匹配
}
if(j>T.length)
	return i-T.length;
else 
	return ERROR;
}
void GetNext(HString T,int next[]){
	/*计算next数组*/
	int i,j;
	i=1,j=0,next[1]=0;
	while(i<T.length){
		if(j==0||next[i]==next[j]){
		++i;
		++j;
		next[i]=j;
		}else
		j=next[j];
	}
}
int Index_KMP(HString S,HString T,int pos,int next[]){
/*
KMP算法
必须先计算一个next[]数组,通过next数组使匹配过程简化
*/
int i,j;
i=pos,j=1;
while(i<=S.length&&j<=T.length){
	if(j==0||S.ch[i]==T.ch[j]){//比上面的BF算法就多了一步判断j==0
	++i;
	++j;
	}else
		j=next[j];//指针回溯的值在next数组中
}
if(j>T.length) 
	return i-T.length;
else
	return ERROR;
}
int main(){
	HString S;

	//CreateString(&S,"woshinidie");
	//DisplayString(&S);

	HString T;
	CreateString(&S,"woshinidie");
	CreateString(&T,"die");

	
	int e=0,next[20];
	 //e=BF_Index(S,T,1);
	GetNext(T,next);
	e=Index_KMP(S,T,1,next);
	if(e<0){
		printf("字符串匹配失败");
	}else
	printf("字符串匹配成功,模式串在主串的出现的位置是:%d\n",e);
	system("pause");
	return 0;
}

简单分析

串是在计算机中非常常用的数据结构,因为我们很多的需要操作的对象数据类型都是字符型的,举一个很简单的例子,我们的日常用的语言写成的文本就是字符型的呀,虽然里面也会有啥数字或其它类型的,但整体还是字符充斥的。而字符串匹配算法就更是一个很常用的算法了,你看如果我们想从往年的英语试卷真题中查询某些词的热度,不就需要字符串匹配来计算这个单词在试卷真题中出现的次数吗?

所谓BF算法就是暴力匹配算法,是我们想到的最直接的解决问题的算法,模式串和主串之间不同的移位以及比较,直到模式串超过主串的范围,期间指向模式串和主串的指针会不停前进和回溯。

而我们的KMP算法在原来的思想上加了很有意义的改进,这个就是增强输入的作用了,我们在使用KMP函数之前必须先生成一个next数组,来使模式串的指针回溯的位置改变,而且在这个算法中,只需要回溯模式串的指针。而关于next数组的获取就有牵扯到最大公共前后缀了,这个网上都有,推荐《大话数据结构》这本书,可以去那一章看看,讲的很清楚。

关于一件事情,我们首先不要想里面实现的细节,而是从大局观上考虑这个事情实现的基本步骤,之后再去看实现某个具体步骤的细节处理。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值