【KMP字符串匹配】C语言实现 代码+视频详解
2020-07-14 21:05
211 查看
这是我看过讲得最好的KMP算法的视频了~视频适合小白,还请大佬指教!
建议先看完视频,再配上文末代码食用!
视频含代码,算法步骤讲解分析,通俗易懂。(声音好听)
KMP字符串匹配算法1
KMP字符串匹配算法2
注意第一段视频中主要分析讲解步骤,第二段视频开始讲解代码。
下面是本人看完视频后敲的代码,配上自己写的注释方便理解。
#include<stdio.h> #include<string.h> #include<stdlib.h> void prefix_table(char pattern[] , int prefix[],int n)//找到前缀表 {//三个参数分别表示需要比较的串,前缀表,待比较串/前缀表的长度 prefix[0]= 0;//第一位永远等于0 int len = 0;//len表示此时最长公共前后缀的长度 int i = 1;//从第1位置字母开始检测 while(i < n) { if( pattern[i] == pattern[len])//若相等,len++ { len++; prefix[i] = len;//在前缀表中填上这个长度 i++;//往后检测下一个字母 } else//若不相等 { if(len>0) len = prefix[len - 1]; //将len对应于prefix前一个位置 else//当len = 0, { prefix[i] = len;//此时已经没有办法再向后退了,直接等于0 i++; } } } } void move_prefix_table(int prefix[],int n) {//把前缀表向后移一位,空出来的位置填上-1,方便KMP操作。由于前缀表严格来说并不包括最后完整的串的公共前后缀,所以原来的最后一位被覆盖没有关系 int i; for(i = n-1;i>0;i--) { prefix[i] = prefix[i-1]; } prefix[0] = -1; } void KMP_search(char text[],char pattern[]) {//在text里面搜索pattern int i = 0,j = 0; int m = strlen(text); int n = strlen(pattern); int* prefix = malloc(sizeof(int)*n); prefix_table(pattern,prefix,n); move_prefix_table(prefix,n); //text[i]表示text中第i个,text长度为m //pattern[j]表示pattern中第j个,pattern长度为n while(i < m) { if(j == n-1 && text[i] == pattern[j]) { printf("Found pattern at %d\n",i-j); j = prefix[j]; } if(text[i] == pattern[j]) { i++; j++; } else { j = prefix[j]; if(j == -1) { i++; j++; } } } } int main() { char pattern[] = "ABABCABAA"; char text[] = "ABABABCABAABABABAB"; KMP_search(text,pattern); int i; return 0; }
相关文章推荐
- KMP字符串匹配算法及C语言实现
- KMP字符串匹配C++代码实现
- 【C语言】朴素字符串匹配算法及其实现
- 字符串匹配 之 KMP详解
- LeetCode实现strStr()字符串匹配(C语言)
- 字符串匹配的KMP算法详解及C#实现
- C语言 选择排序算法详解及实现代码
- C语言itoa()函数和atoi()函数详解(整数转字符C实现)
- 字符串匹配的RabinKarp算法的c语言实现
- C语言itoa()函数和atoi()函数详解(整数转字符C实现)
- kmp算法字符串匹配C语言实现
- C语言itoa()函数和atoi()函数详解(整数转字符C实现)
- 字符串匹配KMP(Java实现)
- C语言itoa()函数和atoi()函数详解(整数转字符C实现)
- 字符串匹配KMP算法的C语言实现
- 传统字符串匹配算法--Brute Force算法的C代码实现
- 字符串匹配--Sunday算法-C语言实现
- 算法导论第三十二章-字符串匹配-Cpp代码实现
- C语言实现字符串匹配KMP算法
- KMP字符串匹配算法模板代码