我的KMP算法总结并记录

今天对这学期学的字符串匹配算法进行总结并记录。

根据清华大学出版社出版的算法设计与分析(第2版)王红梅 胡明 编著

  • KMP算法基于蛮力法实现的
  • KMP算法是BF算法的改进算法
  • KMP 算法主要由两个函数构成。一个是next数组的获取,二是对主串S和模式串T的匹配
//KMP字符串匹配算法,BK算法的改进版本 
#include <iostream>
#include <cstring>
using namespace std;

//获取 next 数组的值 
void GetNext(char T[],int next[])
{
	int i;			
	int j;			//记录 next 数组的下标
	int len; 		//相等子串的长度 -1
	next[0] = -1;   //将next数组第一个数赋值为-1 
	for(j = 1; T[j] != '\0';j++)	//依次求 next[j] 
	{
		for(len = j-1; len >= 1; len--)   //从最大字串开始匹配 
		{
			for(i = 0;i < len; i++)	  //比较是否相等 
				if(T[i] != T[j-len+i])  break;
			if(i == len)
			{
				next[j] = len; break;
			}
		}
		if(len < 1)  next[j] = 0;
	 } 
}

int KMP(char S[],char T[])
{
	int i = 0, j = 0;   //记录字符串比较的位置
	int next[80]; 		//假设next数组的长度为80,存放 K 值 ,公共子字符串 
	GetNext(T,next);	//获取next数组的值
	while(S[i] != '\0' && T[j] != '\0') //如果主串S和模式串都没有到尽头,则继续比较 
	{
		if(S[i] == T[j]) 	//判断当前位置是否匹配,匹配则继续比较下一个位置 
		{
			i++;j++;
		 }else{				//否则,记录当前的 i ,j的值获取 next数组的值
		  	j = next[j];
			  if(j == -1)	//如果 j = -1,表示无公共子字符串,模式串回溯重新匹配 
		 	  {
			     i++; 		//主字符串S和模式串T同时往前移 
				 j++;                                                                                                                                                                                                                                                                                                   
			   } 
		 } 
	}
	//判断模式串是否匹配成功 
	if(T[j] == '\0') return (i-strlen(T)+1); 
	else return 0;
}

int main(int argc, char** argv) {
	char S[8] = {'a','b','c','a','b','a','a','\0'};
	char T[5] = {'c','a','b','a','\0'};
	cout << KMP(S,T) <<endl;
	system("pause");
	return 0;
}```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值