这是我看过讲得最好的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;//第一位永远等于0int 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;//此时已经没有办法再向后退了,直接等于0i++;}                    }       }
}
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里面搜索patternint 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长度为nwhile(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语言实现 代码+视频详解相关推荐

  1. Python字符串匹配神器TheFuzz库的实战详解

      TheFuzz库对应的源码链接为:https://github.com/seatgeek/thefuzz.需要说明的是,TheFuzz库是FuzzyWuzzy库的升级版本,后者在2020年后已经不 ...

  2. Simpsons’ Hidden Talents辛普森一家的隐藏天赋(next数组和kmp字符串匹配)

    辛普森一家的隐藏天赋 HDU - 2594 目录 辛普森一家的隐藏天赋 HDU - 2594 题意描述:当给定字符串s1和s2时,找到s1中最长的前缀,即s2的后缀.如果有,输出相同的字符串即字符串长 ...

  3. KMP算法小总结 洛谷P3375 【模板】KMP字符串匹配

    提问:这里有一个长度为n的字符串str1和长度为m的字符串str2(n > = m),问在str1中str2出现了几次? 如果使用暴力求解,一个一个比较,在n和m都极大的情况下将花费非常多的不必 ...

  4. 落谷 P3375 【模板】KMP字符串匹配

    题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next. 输入格式: 第一行为一个字符串,即为s1 ...

  5. Oulipo-欧力波(KMP字符串匹配问题)

    Oulipo-欧力波 HDU - 1686 The French author Georges Perec (1936–1982) once wrote a book, La disparition, ...

  6. c语言比特和字节,详解 比特(位,bit),字节(Byte),字符的区别 *(转)

    比特(位):英文bit,是计算机晶体管的一种状态(通电与断电).就是0与1,真与假,是计算机最基本的传输单位. 示例: 2bit : 10; 4bit : 1111; 8bit : 1111 1111 ...

  7. c语言菜单选择如何用字符形式,【创客天地】计算机二级C语言、VB考试详解分析...

    原标题:[创客天地]计算机二级C语言.VB考试详解分析 01 马上就要迎来计算机二级考试了,你准备好了吗?今天助手君准备了一点C语言干货,希望对即将考试的你有所帮助.(上期刚刚推了office,有需要 ...

  8. C语言解决约瑟夫问题详解的代码

    C语言解决约瑟夫问题详解的代码 参考文章: (1)C语言解决约瑟夫问题详解的代码 (2)https://www.cnblogs.com/odsxe/p/10791049.html (3)https:/ ...

  9. Unity 分享 功能 用Unity Native Share Plugin 实现链接、图片、视频等文件的分享+ 安卓 Ios 都可以,代码图文详解

    Unity 分享 功能 用Unity Native Share Plugin 实现链接.图片.视频等文件的分享+ 安卓 Ios 都可以,代码图文详解 前言 环境 效果 一.Unity Native S ...

最新文章

  1. python3.6 messagebox_Python Tkinter GUI编程入门介绍
  2. 【NIO】IO多路复用
  3. ElasticSearch实战:Linux日志对接Kibana
  4. Jquery-zTree的基本用法
  5. java 类 赋值_Java实现不同的类的属性之间相互赋值
  6. java.lang.NoClassDefFoundError Adding a jar to an RCP application
  7. 二分法(递归非递归)
  8. [LeetCode] Reverse Linked List I II - 链表翻转问题
  9. Hibernate性能提升
  10. SQL Server数据库查询区分大小写、全半角——排序规则的应用(转载)
  11. springAMQP
  12. adb安装apk报错Failure [INSTALL_FAILED_INVALID_URI]
  13. 最全.Net学习资料库上线,今日可免费下载各类资源!(附百度云链接)
  14. AutoCAD .net 二次开发官方教程及源码C#版(4)-(源码下载)
  15. 一款由css3和jquery实现的卡面折叠式菜单
  16. CCF NOI1048 检测矩阵
  17. Android货币转换代码,使用XE Currency for Android转换货币,无需互联网 | MOS86
  18. Windows7下Edge的首页关闭我的资讯,兴趣等
  19. vbm 分析_VBM
  20. Node图片识别文字

热门文章

  1. 专业之路:13条PS高阶技巧
  2. C++中string输入空格的方法
  3. 百练2075:Tangled in Cables题解
  4. 第二十四章 死抠synchronized关键字
  5. xczu3eg板子安装Ubuntu文件系统
  6. 【计算机网络】Transmission-Control-Protocol拥塞控制
  7. 利用Stripes实现Java Web开发
  8. 南师大计算机学科评估排名,榜单|全国高校学科评估:这些高校这些学科全国排前十!(A-篇)...
  9. 形状识别——内六角螺丝内六角识别
  10. amd显卡测试软件linux,狂追Nvidia:AMD发布新版Linux开源显卡驱动