KMP字符串模式匹配算法(C++)

【问题描述】KMP算法是字符串模式匹配算法中较为高效的算法之一,其在某次子串匹配母串失败时并未回溯母串的指针而是将子串的指针移动到相应的位置。

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

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

【样例输入】

string str
thisisalongstring isa
nosubstring subt

【样例输出】

1

5

0

【提示】表示字符串的数据结构可以是字符数组或用串类实现。KMP算法调用很简单,但难的是理解算法的思想。掌握算法的思想才能说是掌握算法。

代码实现

#include<iostream>
#include<string>
#define maxsize 200
using namespace std;
struct lsystring
{
	char data[maxsize];
	int len;
};
void getnext(lsystring lsy,int next[])
{
	int j=0,k=-1;
	next[0]=-1;
	while(j<lsy.len-1)
	{
		if(k==-1||lsy.data[j]==lsy.data[k])
		{
			j++;k++;
			next[j]=k;
		}
		else
		{
			k=next[k];
		}
	}
}
void KMPindex(lsystring lsy1,lsystring lsy2)
{
	int next[maxsize],i=0,j=0;
	getnext(lsy2,next);
	while(i<lsy1.len&&j<lsy2.len)
	{
		if(j==-1||lsy1.data[i]==lsy2.data[j])
		{
			i++;j++;
		}
		else j=next[j];
	}
	if(j>=lsy2.len)
	cout<<i-lsy2.len+1<<endl;
	else
	cout<<"0"<<endl;
}
int main()
{
	lsystring lsy1,lsy2;
	string s1,s2;
	while(cin>>s1>>s2)
	{
		lsy1.len=s1.length();
		lsy2.len=s2.length();
		s1.copy(lsy1.data,lsy1.len,0);
		*(lsy1.data+lsy1.len)='\0';
		s2.copy(lsy2.data,lsy2.len,0);
		*(lsy2.data+lsy2.len)='\0';
		KMPindex(lsy1,lsy2);
    }
	return 0;
}

KMP算法详解请看:数据结构KMP算法配图详解(超详细)_哈顿之光的博客-CSDN博客_数据结构kmp算法

强推这篇文章,讲解细致,图片直观,通俗易懂。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值