KMP字符串匹配模板(精简代码!)

这个知识点对第一次学的人来说是相当不有好的,但在本蒟蒻的反反复复的思考下终于以2个小时为代价将TA搞懂了!
下面为代码:
(重点还是理解Next数组的求法即自己匹配自己来找公共前后缀!)//注意:本代码的字符串字符位置从0开始!

#include
using namespace std;

int lena,lenb,Next[1000010],f=0;
char sa[1000010],sb[1000010];
void getNext()//求next数组
{
	int j=0,k=-1;Next[0]=-1;
	while(j<lenb)//k跳到最前面时(k=-1)不能再往前跳,需要移至子串首字符位置
		{
			if(k==-1||sb[j]==sb[k])Next[++j]=++k;//若相同最大前缀长度加一
			else k=Next[k];//若不同则跳到最大前缀位置后一个
		}	
}

void work()//字母串匹配
{
	int i=0,j=0;
	while(i<lena)
	{
			f(j==-1||sa[i]==sb[j])i++,j++;//匹配成功,继续匹配下一个字符.
		else j=Next[j];//匹配失败,所以j从最大前缀位置后一个继续下面的匹配
		if(j==lenb)
		{
			cout<<i-lenb+1<<endl;//求匹配成功时子串出现位置(首字符位置)
			i--,j=Next[j-1];//因为j已经跳到了边界,所以j从最大前缀位置后一个继续下面的匹配
			f=1;
		}	
	}
		//if(!f)puts("No");
}
	
int main()
{
	scanf("%s",sa);
	lena=strlen(sa);
	scanf("%s",sb);
	lenb=strlen(sb);
	getNext();
	work();
	for(int i=1;i<=lenb;i++)
	printf("%d ",Next[i]);//next数组输出,next[0]=-1;
	return 0;
}

萌新入新坑,恳请给个赞!

你可能感兴趣的:(KMP,字符串)