C语言 题目 1691: 数据结构-KMP字符串模式匹配算法实现

字符数组下标从0开始,这个要注意一下,每次判断的时候当前i,j减一进行判断

题目描述

KMP算法是字符串模式匹配算法中较为高效的算法之一,其在某次子串匹配母串失败时并未回溯母串的指针而是将子串的指针移动到相应的位置。严蔚敏老师的书中详细描述了KMP算法,同时前面的例子中也描述了子串移动位置的数组实现的算法。前面你已经实现了子串移动的数组,现在就来利用该数组来实现KMP模式匹配。

下面是相应的算法:

图:KMP算法

输入格式

3组字符串,每组字符串占一行。每行包含由空格分隔的两个字符串,字符串仅由英文小写字母组成且长度不大于100。

输出格式

每组数据输出1行,输出后一个字符串在前一个字符串中的位置,如果不匹配,则输出0。

样例输入

string str
thisisalongstring isa
nosubstring subt

样例输出

1
5
0

 

#include<stdio.h>
#include<string.h>
void next_(int next[],char s[]);//获取next数组 
int main(){
   char s1[128];
   char s2[128];
   int l1;
   int l2;
   while(~scanf("%s",s1)){
   	getchar();
   	scanf("%s",s2);
   	getchar();
   	int next[128];
   	l1=strlen(s1);
   	l2=strlen(s2);
   	next_(next,s2);
   	int i=1,j=1;
	while(i<=l1&&j<=l2){
		if(j==0||s1[i-1]==s2[j-1]){//注意减一 
			i++;
			j++;
		}
		else{
			j=next[j];
		}
	}
	if(j>l2)
	printf("%d\n",i-l2);
	else
	printf("0\n");
   }
}
void next_(int next[],char s[]){
	int l=strlen(s);
	next[1]=0;
	int i=1;
	int j=0;
	while(i<l){
		if(j==0||s[i-1]==s[j-1]){//注意减一 
			i++;
			j++;
			if(s[i-1]!=s[j-1])
			next[i]=j;
			else
			next[i]=next[j];
		}
		else{
			j=next[j];
		}
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值