多种方式学习kmp算法

苦涩难懂kmp算法

文章只为记笔记,借鉴了其他博客的文章,勿怪。

1、漫画理解KMP算法::https://blog.csdn.net/qq_39213969/article/details/103472012
2、B站天勤视频:https://www.bilibili.com/video/BV17i4y1t76L?p=34
3、博客:https://blog.csdn.net/qq_37969433/article/details/82947411

暴力算法

int Index_BF ( char S [ ], char T [ ], int pos )
{
/* 若串 S 中从第pos(S 的下标0≤pos<StrLength(S))个字符
起存在和串 T 相同的子串,则称匹配成功,返回第一个
这样的子串在串 S 中的下标,否则返回 -1    */
int i = pos, j = 0;
while ( S[i+j] != '/0'&& T[j] != '/0')
if ( S[i+j] == T[j] )
j ++; // 继续比较后一字符
else
{
i ++; j = 0; // 重新开始新的一轮匹配
}
if ( T[j] == '/0')
return i; // 匹配成功   返回下标
else
return -1; // 串S中(第pos个字符起)不存在和串T相同的子串
} // Index_BF

kmp算法

typedef char String[MAXSIZE + 1];

void get_next(String T, int *next)//通过计算返回子串T的next数组
{
	int i, j;
	i = 1;
	j = 0;
	next[1] = 0;
	while (i < T[0])//T[0]表示串的长度
	{
		if (j == 0 || T[i] == T[j])//T[i]表示后缀的单个字符,T[j]表示前缀的单个字符
		{
			++i;
			++j;
			next[i] = j;
		}
		else j = next[j];//若字符不相同,则j值回溯
	}
}

int Index_KMP(String S, String T, int pos)//KMP算法
{
	int i = pos;//i用于主串S中的当前位置下标,若pos不为1,则从pos位置开始匹配
	int j = 1;//j用于子串T中当前位置下标值
	int next[255];//定义一next数组
	get_next(T, next);//对串T作分析,得到next数组
	while (i < S[0] && j <= T[0])//若i小于S的长度并且j小于T的长度时,循环继续
	{
		if (j == 0 || S[i] == T[j])//两字母相等则继续,与朴素算法增加了j=0判断
		{
			++i;
			++j;
		}
		else//指针后退重新开始匹配
			j = next[j];//j退回合适的位置,i值不变
	}
	if (j > T[0])
		return i - T[0];
	else return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值