KMP实现

 

确实不好理解啊

 

 

#include<bits/stdc++.h>
using namespace std;

int next[1005];

/*
	next[j+1] 数组记录的是 p[j]及之前的最大前缀后缀长度 
	next只与模式字符串有关(关键) 
*/ 
void getNext(char *p, int next[])
	{
		int pLen = strlen(p);
		next[0] = -1;
		int k = -1;
		int j = 0;
		while(j < pLen-1){ //这里要注意一下 
			if(k == -1 || p[k] == p[j]){
				++k;
				++j;//这个先加 然后才有next[j] = k  从而达到 next[j+1]表示j及之前前缀后缀长度的目的 
				next[j] = k;
			}
			else{
				k = next[k]; //出现不匹配时候 在字串中寻找匹配 直到k = -1 说明没有匹配字符 
			}
		}			
	}

int kmpSearch(char *s, char *p)
	{
		int i = 0,j = 0;
		int sLen = strlen(s);
		int pLen = strlen(p);
		while(i < sLen && j < pLen){
			if(j == -1 || s[i] == p[j]){
				++i;
				++j;
			}
			else{
				j = next[j];//当出现不匹配时候 直接跳到下一个位置 继续跟i = i+1匹配 
			}
		}
		
		if(j == pLen){//说明找到匹配 
			return i-j; //匹配的位置 
		}
		else{
			return -1; //未匹配 
		}		
	}	
	
int main()
	{
		char s[] = "asvdababccdababc";
		char p[] = "ababc";
		
		getNext(p,next);
		int res = kmpSearch(s,p);
		
		printf("%d\n",res);
		
		return 0;	
	} 

参考:

https://www.cnblogs.com/yjiyjige/p/3263858.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值