数据结构学习笔记(10.KMP模式匹配算法)

本节知识点:

1. KMP模式匹配算法,是为了避免普通字符串匹配算法中,没有必要的重复比较而设计的!在普通字符串比较中,通常有很多重复性的比较,KMP就是利用一个next数组当做索引,来避免这些重复性的比较!
2.对于具体算法的分析,本节不做过多叙述,详细可以参考<大话数据结构> 一书中的P135页。本节只做代码的保存!
示例代码:
/************************************************************************************ 
文件名:main.c
头文件:无 
时间: 2013/03/31 
作者: Hao 
功能:KMP匹配算法的实现 
难点:1.KMP算法的分析 才是真正的难点 
************************************************************************************/ 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


/************************************************************************************ 
函数名:   get_next
函数功能: 获得子串的next数组 
参数:     const char* str 字串数组 即要匹配的字符串  int* next 获得的next数组 
返回值:   无 
************************************************************************************/
void get_next(const char* str ,int* next)
{
	int i, j;
	i = 1;
	j = 0;
	next[1] = 0; //这个规定node数组是从第1个位置开始的且为0  第0个位置不用  
	while(i<strlen(str))
	{
		/*T[i]表示后缀的单个字符   T[j] 表示前缀的单个字符*/
		if((0 == j) || (str[i-1] == str[j-1]))  
		{
			++i;
			++j;
			if(str[i-1] != str[j-1]) 
			{
				next[i] = j;
			} 
			else
			{
				next[i] = next[j];
			}	
		}
		else
		{
			j = next[j];
		}
	} 
} 

/************************************************************************************ 
函数名:   Index_KMP
函数功能: 从主串Src到第pos位置开始 寻找子串str 出现的第一个位置 
参数:     const char* Src主串, const char* str子串, int pos重主串第pos位置开始寻找子串 
返回值:   成功 返回子串在主串中的第一个位置
           失败  即不存在匹配项 则返回-1
注意:     pos是从0位置开始计算的   return的值是从1开始计算的  
************************************************************************************/
int Index_KMP(const char* Src, const char* str, int pos)
{
	int i = pos; //i永远是主串的下标   i永远不回溯 
	int j = 0;       //j是子串的下标    j要根据next数组进行回溯 
	int next[100];
	get_next(str ,next);
	/*当i = strlen(Src) 说明主串遍历结束*/
	/*当j = strlen(str) 说明子串匹配完成*/ 
	while( (i < strlen(Src) ) && (j < strlen(str)) )  
	{
		if((0 == j) || (Src[i-1] == str[j-1]))
		{
			++i;
			++j; 
		}
		else
		{
			j = next[j]; // 匹配失败 j进行回溯 
		} 
		
	}
	if(j == strlen(str)) // 是子串匹配成功的情况  跳出的while循环 
	{
		return i - j + 1; 
	} 
	else
	{
		return -1;
	}
	 
} 

int main(int argc, char *argv[]) 
{
	char* p = "ababaaaba";
	char* s = "aab";

	printf("%d\n",Index_KMP(p, s, 0));
	printf("%d\n",Index_KMP(p, s, 5));
	printf("%d\n",Index_KMP(p, s, 6));
	return 0;
}

注意:对于KMP匹配算法,可以不一定完全理解next数组的算法,但一定要会使用next数组来对j变量进行回溯!!!达到查找的目的!!!




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值