C语言实现KMP算法

题目

在这里插入图片描述

解答
	#include<stdio.h>
	#include<string.h>
	
	#define MAXSTRLEN 100
	
	typedef char SString[MAXSTRLEN+1];  //顺序串,数组第0纬存放字符串的长度
	
	/*初始化顺序串*/
	int StrAssign_Sq(SString s,char c[]){
		int i,len;
		len=strlen(c);
		if(len>MAXSTRLEN)
			return -1;
		for(i=1;i<=len;i++)
			s[i]=c[i-1];
		s[0]=len;
		return 1;
	}
	
	/*打印顺序串*/
	void StrPrint_Sq(SString S){
		int i;
		for(i=1; i<=S[0]; i++)
			printf("%c", S[i]);
	}
	
	/*求子串相应字符下next数组的值*/
	void getNext(SString p,int next[]){
		int i=1;
		int j=0;
		next[1]=0;
		while(i<p[0]){
			if(p[i]==p[j]||!j){
				i++;
				j++;
				next[i]=j;
			}
			else
				j=next[j];
		}
	}
	
	/*改进的求next数组值的方法*/
	void getNextval(SString p,int next[]){
		int i=1;
		int j=0;
		next[1]=0;
		while(i<p[0]){
			if(p[i]==p[j]||!j){
				i++;
				j++;
				if(p[i]!=p[j])
					next[i]=j;
				else
					next[i]=next[j];
			}
			else
				j=next[j];
		}
	}
	
	/*KMP算法(严蔚敏版)*/
	int KMP(SString s,SString p,int pos){
		int i,j,next[MAXSTRLEN];
		if(pos<1)
			return 0;
		i=pos;
		j=1;
		//getNext(p,next);   //填充next数组
		getNextval(p,next);  //改进的方法填充next数组
		while(i<=s[0]&&j<=p[0]){
			if(s[i]==p[j]||j==0){
				i++;
				j++;
			}
			else
				j=next[j];    //主串不再回溯,子串回朔
		}
		if(j>p[0])
			return i-p[0];
		else
			return 0;
	}
	
	void main(){
		char *s1="abcabca";
		char *s2="ca";
		int pos=1;    //从第一个字符开始匹配
		int f;        //子串在主串中首次出现的位置
		SString s;    //主串
		SString p;    //模式串
		StrAssign_Sq(s, s1);
		StrAssign_Sq(p, s2);    
		printf("主串中的元素为:s = ");						 
		StrPrint_Sq(s);
		printf("\n");
		printf("子串中的元素为:p = ");						 
		StrPrint_Sq(p);
		printf("\n");
		f=KMP(s,p,pos); //KMP实现子串在主串中的定位
		printf("子串在主串中首次出现的位置为%d\n",f);
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值