KMP 算法 字符匹配

#include <iostream>
using namespace std;

void Next(char* s,int* next,int len)
{
	/*
		获得next数组其实相当于自身与自身做匹配。
		初始i=0,j=-1;next[0]=-1;
		在while中,if(j==-1 || s[i] = s[j])
				当j=-1
					1.第一次进入循环,j++,i++  做s[0]与t[1]的比较
					2.往后如若j=-1说明在s中当前比较的字符与模式串第一个字符还不相等 
							就要做i++ j++ 了. t要做下一个字符的比较了
					  在这里,一开始我总忘写 if j==-1 这个条件,导致错误
					  后来仔细看看,当再一次比较时(i > 0 && j > 0) 当比较不相等时, j = next[j]
					  在比较还是不相等 即 j = next[j]
					  在比较还是不相等  .....
					  .....	...			.....
					  .....	...			.....
					  在比较还是不想等 即 j = next[0] = -1
					  此时说明在模式串中再也找不到适合的next[j]了
					  所以在这里限制一个条件,当j==-1(也就是再也找不到适合的next[j])
					  ,模式串和匹配串index都要后移一位 ,如果不加这个条件 当j==-1 会有边界溢出的错误
	*/
	int i=0,j=-1;
	next[0] = -1;
	while( i < len)
	{
		if(j == -1 || s[i] == s[j])
		{
			i++;
			j++;
			next[i] = j;
		}
		else
		{
			j = next[j];
		}
	}
}
int KMP(char* t,char* s,int* next)
{
	int i = 0,j = -1;
	int lent = strlen(t);
	int lens = strlen(s);
	while( i < lent && j < lens)
	{
		if( j == -1 || t[i] == s[j])
		{
			i++;
			j++;
		}
		else
		{
			j = next[j];
		}
		cout<<i<<" "<<j<<endl;
	}
	if(j >= lens)
		return i - lens + 1;
	return -1;
}
int main()
{
	char t[] = "acabaabaabcacaabc";
	char s[] = "abaabcac";
	int len = strlen(s);
	int next[10];
	Next(s,next,len);
	cout<<" next:";
	for(int i = 0; i < len; i++)
		cout<<next[i];
	cout<<endl;
	cout<<t<<endl;
	cout<<s<<endl;
	int pos = KMP(t,s,next);
	cout<<"位置:"<<pos<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值