最近学算法,了解了一些好玩的东西。
KMP算法(Knuth-Morris-Pratt)的K的指的是计算机大佬 高德纳
大神就是大神,人生经历牛逼。
昨天在看舞蹈链的知识(也是高德纳大神发明的୧(๑•̀◡•́๑)૭)

分析

为了能够理解AC自动机,我又看起了KMP,这个KMP最难理解的还是next数组
就是那一句k=next[k],太难理解了。
写的话还是能把KMP写出来的。
首先写暴力算法,在暴力算法的基础上写出kmp算法,至于get_next()结构和kmp算法很想,再此基础上略微改变就行。

kmp算法通过取消了主串的回溯,来加快算法。
因为有一些比较是多余的,可以通过模式串的结构来简化这个过程。
next数组的一个核心概念就是前缀和后缀。
它求的是一个字符串的相同的最大前缀和最大后缀的长度。

至于以前一直困扰我的next数组赋值的问题,最近想明白了,其实他们是一致的,多1少1无非是为了程序好写。

My Code

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=1e6+5;int NEXT[maxn];
int bf(char* source,char *pattern )
{int n=strlen(source);int m=strlen(pattern);int i=0;int j=0;while(i<n&&j<m){if(source[i]==pattern[j]){i++;j++;}else{i=i-j+1;j=0;            }}if(j==m)return i-j;elsereturn -1;
}int kmp(char* source,char *pattern )
{int n=strlen(source);int m=strlen(pattern);int i=0;int j=0;while(i<n&&j<m){if(j==-1||source[i]==pattern[j]){i++;j++;}else{j=NEXT[j];}}if(j==m)return i-j;elsereturn -1;
}void GetNext(char* pattern)
{int pLen = strlen(p);NEXT[0] = -1;int k = -1;int j = 0;while (j < pLen - 1){//p[k]表示前缀,p[j]表示后缀if (k == -1 || p[j] == p[k]) {++k;++j;NEXT[j] = k;}else {k = NEXT[k];}}
}int main()
{/*// 指针初始化 字符串常量, 内存分配在全局的const内存区,需要加上constchar* source="BBC ABCDAB ABCDABCDABDE"; char* pattern="ABCDABD";// 正确的初始化操作char* source="BBC ABCDAB ABCDABCDABDE";char* pattern="ABCDABD";char source[]="BBC ABCDAB ABCDABCDABDE";char pattern[]="ABCDABD";*/char source[]="BBC ABCDAB ABCDABCDABDE";char pattern[]="ABCDABD";   printf("%s\n",source);printf("%s\n",pattern);cout<<bf(source,pattern)<<endl;GetNext(pattern);cout<<kmp(source,pattern)<<endl;;return 0;
}

转载于:https://www.cnblogs.com/shengwang/p/9779449.html

kmp 学习【字符串-kmp学习】相关推荐

  1. KMP子字符串匹配算法学习笔记

    文章目录 学习资源 什么是KMP 什么是前缀表 为什么一定要用前缀表 如何计算前缀表 前缀表有什么问题 使用next数组来匹配 放码过来 构造next数组 一.初始化 二.处理前后缀不相同的情况 三. ...

  2. 数据结构与算法(5)字符串(BF算法、KMP算法及KMP算法优化)

    目录 一.BF算法(暴力算法) 二.KMP算法 三.KMP算法优化 一.BF算法(暴力算法) 一个一个往后匹配,匹配失败继续从母串下一个和头(子串的头)往后继续匹配. 虽然简单,但是需要较多的时间复杂 ...

  3. python实现Trie 树+朴素匹配字符串+RK算法匹配字符串+kmp算法匹配字符串

    一.trie树应用: 相应leetcode 常用于搜索提示,如当输入一个网址,可以自动搜索出可能的选择.当没有完全匹配的搜索结果,可以返回前缀最相似的可能. 例如三个单词app, apple, add ...

  4. 查找子字符串----KMP算法深入剖析

    假设主串:a b a b c a b c a c b a b       子串:a b c a c 1.一般匹配算法 逐个字符的比较,匹配过程如下: 第一趟匹配 a b a b c a b c a c ...

  5. php 培训ppt_php学习 字符串课件

    php学习 字符串课件 更新时间:2008年06月15日 12:53:47   作者: 字符串的定义 string(字符串)在PHP中字符跟字节一样,有256种字符的可能性 语法 字符串string可 ...

  6. python学习 字符串函数

    python学习 字符串函数 字符串不能被改变,以下和函数,只是 原字符串初始化后不能改变,函数只是将改变后的值返回赋给新的变量(当然可以赋给原来的变量) 大小写函数 capitalize()函数 大 ...

  7. 学习字符串过程中,运行结果有一串烫烫烫该怎么解决

    学习字符串的最基础内容,程序运行出来了,却出现这样的问题 #include <stdio.h> int main() { char arr1[] = "abc";cha ...

  8. 【总结】字符串匹配: KMP 和 拓展KMP

    比起ac自动机,kmp就一个next数组,理解了如何初始化next后就可以搞一些模板题了,下面是还不错的学习资料,清晰易懂,自己用的模板也来自它: http://chaoswork.com/blog/ ...

  9. 《深度学习,统计学习,数学基础》人工智能算法工程师手册:程序员写的AI书,50 章一网打尽...

    来源:专知 本文约3400字,建议阅读10+分钟. 免费开源人工智能手册,带你快速上手写代码! [ 导读 ]市面上很多人工智能相关的书籍.大部分的书,面向小白,内容深度不够:小部分教材书或者科研书,内 ...

  10. python学习路线-2020年 Python学习路线及学习目标规划 拿走不谢!

    找不到完整的学习路线?小编分享2020年Python学习路线及学习目标规划拿走不谢,Python作为今年来特别受欢迎的编程语言,是AI时代头牌语言AI领域的敲门砖,Python已经入驻小学生教材,将来 ...

最新文章

  1. 设计模式之组合模式(Composite)摘录
  2. bzoj1799 数位dp
  3. Objective-C:Objective-C:文件中一些对目录进行操作的函数
  4. mt7628 pcie挂载nvme并测试
  5. c#只读字段和常量的区别,以及静态构造函数的使用 .
  6. crv仪表上的i是什么指示灯_汽车打不着火是怎么回事,仪表盘汽车发动机故障灯亮是什么情况故障指示灯图解大全集...
  7. java清理垃圾_垃圾清理势在必行——Java垃圾收集算法
  8. 详解浏览器 428 状态码 428 Precondition Required
  9. 小精灵股市行情软件办公室专用绿色版.rar
  10. js 实现通过身份证获取年龄
  11. Python整数求和
  12. 网页端哔哩哔哩4倍速播放视频
  13. 流程型与离散型制造的区别【老外的分析】
  14. uni-app开发中的#ifdef MP是什么意思?条件编译
  15. Win10开始菜单卡死解决办法
  16. 王刚日记:在互联网第一次赚到钱
  17. mobil连接数据的关键语句
  18. c 语言 蒙特卡洛程序,蒙特卡洛步骤学习(一)
  19. IntelliJ IDEA/Android Studio 翻译插件,可中英互译。
  20. 揭秘阿里、腾讯、字节跳动在家办公的区别

热门文章

  1. s:radio 赋值取值和添加事件
  2. 学习pytorch: 数据加载和处理
  3. Toontrack EZbass for mac - 虚拟低音音频插件
  4. 仿微信朋友圈图片按下效果
  5. Ajax 跨域,这应该是最全的解决方案了
  6. 使用CleanMyMac软件进行文件清理
  7. JVM运行机制理解整理
  8. 陆上物探测量基本理论之一---高程
  9. Oracle Web链接客户端
  10. Oracle SQL篇(四)group by 分组与分组的加强 rollup