字符串之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语言)的主要内容,如果未能解决你的问题,请参考以下文章
编程实践使用golang 解析json字符串代码 / 使用 golang 实现一个HashSet / 使用C语言实现KMP算法,并加上非常详尽的注释。
数据结构(C语言版)严蔚敏(字符串的模式匹配算法--KMP算法)