KMP 算法

  • 字符串模式匹配

朴素字符串模式匹配

#include<string.h>
#include<assert.h>

int NaiveStrMatching(const String & T,const String & P){	
	int p=0;                   //模式的下标变量
	int t=0;                   //目标的下标变量
	int plen=P.length();       //模式的长度
	int tlen=T.length();       //目标的长度
	if(tlen<plen){             //如果目标比模式短,匹配无法成功
		return -1;
	}
	while(p<plen && t<tlen){   //反复比较对应字符进行匹配
		if(T[t]==P[p]){
			p++;
			t++;
		}else{
			t=t-p+1;
			p=0;
		}
	}
	if(p>=plen){
	return (t-plen+1);
	}else{
	return -1;
	}
}

KMP 算法

  • 特征向量k:前k个字符组成的前缀子串
#include<string.h>
#include<assert.h>

int *Next(String P){                   //计算特征向量
	int m=P.strlen();
	assert(m>0);
	int *N=new int[m];
	assert(N!=0);
	N[0]=0;
	for(int i=1;i<m;i++){             //对P的每一个位置进行分析
		int k=N[i-1];                 //第i-1位置的最长前缀串长度
		while(k>0 && P[i]!=P[k]){
			k=N[k-1];
		}
		if(P[i]==P[k]){
			N[i]=k+1;
		}else{
			N[i]=0;
		}
	}
	return N;
}

int KMPStrMatching(String T,String P,int *N,int startIndex){	
	int lastIndex=T.strlen()=P.strlen();
	if((lastIndex-startIndex)<0){
		return -1;
	}
	int i;                                    //指向T内部字符的游标
	int j=0;                                  //指向P内部字符的游标
	for(i=startIndex,;i<T.strlen();i++){
		while(P[j]!=T[i] && j>0){
			j=N[j-1];
		}
		if(P[j]==T[j]){                      //当P的第j位与T的第i位相同时
			j++;
		}
		if(j==P.strlen()){                  //匹配成功,返回T子串的开始位置
			return (i-j+1);
		}
	}
	return -1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值