字符串之KMP算法(C语言)

Posted bfhonor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串之KMP算法(C语言)相关的知识,希望对你有一定的参考价值。

一、KMP算法

  • 由D.E.Knuth,J.H.Morris和V.R.Pratt提出,因此称为KMP算法
    在这里插入图片描述

(一)朴素模式匹配算法

1. 思路一:子串和主串进行匹配的时候,随机位置某一个字符不匹配

在这里插入图片描述

  • 一旦发现当前这个子串中某个字符不匹配,就只能转而匹配下一个子串(从头开始)

2. 思路二:子串和主串进行匹配的时候,只有最后一个字符不匹配

在这里插入图片描述

  • ❗❗❗不匹配的字符之前,⼀定是和模式串⼀致的❗❗❗
    在这里插入图片描述
  • 对于模式串 T = ‘abaabc’,当第6个元素匹配失败时,可令主串指针 i 不变,模式串指针 j=3
    在这里插入图片描述

3. 如果其他位置不匹配呢?

(1)、对于模式串 T = ‘abaabc’,当第5个元素匹配失败时? 怎么搞?

  • 可令主串指针 i 不变,模式串指针 j = 2
    在这里插入图片描述

(2)对于模式串 T = ‘abaabc’,当第4个元素匹配失败时? 怎么搞?

  • 可令主串指针 i 不变,模式串指针 j = 2
    在这里插入图片描述

(3)对于模式串 T = ‘abaabc’,当第3个元素匹配失败时? 怎么搞?

  • 可令主串指针 i 不变,模式串指针 j = 1
    在这里插入图片描述

(4)对于模式串 T = ‘abaabc’,当第2个元素匹配失败时? 怎么搞?

  • 可令主串指针 i 不变,模式串指针 j = 1
    在这里插入图片描述

(5)对于模式串 T = ‘abaabc’,当第1个元素匹配失败时? 怎么搞?

  • 匹配下⼀个相邻⼦串
    在这里插入图片描述

(6)总结

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

4. KMP算法

在这里插入图片描述

int Index_KMP(SString S, SString T, int next[]){
	int i=1, j=1;
	while(i<=S.length && j<T.length){
		if(j==0 || S.ch[i] == T.ch[j]){
			++i;		
			++j;		//继续比较后继字符
		}
		else
			j=next[j];	//模式串向右移动
	}
	if(j > T.length)
		return i-T.length;	//匹配成功
	else
		return 0;
}

5. 朴素模式匹配 VS KMP算法

在这里插入图片描述

以上是关于字符串之KMP算法(C语言)的主要内容,如果未能解决你的问题,请参考以下文章

[C语言] 查找字符串出现次数-非KMP算法

编程实践使用golang 解析json字符串代码 / 使用 golang 实现一个HashSet / 使用C语言实现KMP算法,并加上非常详尽的注释。

KMP算法详解——多图,多例子(c语言)

数据结构(C语言版)严蔚敏(字符串的模式匹配算法--KMP算法)

数据结构(C语言版)严蔚敏(字符串的模式匹配算法--KMP算法)

数据结构(C语言版)严蔚敏(字符串的模式匹配算法--KMP算法)