福哥答案2021-02-03:

Knuth-Morris-Pratt 字符串查找算法,简称为 KMP算法,常用于在一个文本串 S 内查找一个模式串 P 的出现位置。
这个算法由 Donald Knuth、Vaughan Pratt、James H. Morris 三人于 1977 年联合发表,故取这 3 人的姓氏命名此算法。
下面直接给出 KMP算法 的操作流程:
1.假设现在文本串 S 匹配到 i 位置,模式串 P 匹配到 j 位置。
2.如果 j = -1,或者当前字符匹配成功(即 S[i] == P[j] ),都令 i++,j++,继续匹配下一个字符。
3.如果 j != -1,且当前字符匹配失败(即 S[i] != P[j] ),则令 i 不变,j = next[j]。此举意味着失配时,模式串 P相对于文本串 S 向右移动了 j - next [j] 位。
4.换言之,将模式串 P 失配位置的 next 数组的值对应的模式串 P 的索引位置移动到失配处。

注意点:
1.字符串的位置一定是右移,不会左移。
2.匹配串的位置是一位一位的右移,左移是根据next数组。
3.字符串和匹配串的某个位置不等的时候,优先匹配串位置左移,左移不动的时候,字符串位置才右移。

代码用golang编写,代码如下:

func strStr(haystack string, needle string) int {
if len(needle)<=0{
return 0
}
return GetIndexOf(haystack,needle)
} func GetNextArray(match string) []int {
matchLen := len(match)
if matchLen == 1 {
return []int{-1}
}
next := make([]int, matchLen)
next[0] = -1
next[1] = 0
i := 2
// cn代表,cn位置的字符,是当前和i-1位置比较的字符
cn := 0
for i < matchLen {
if match[i-1] == match[cn] { //匹配
cn++
next[i] = cn
i++
} else if cn > 0 {
cn = next[cn] //可回退指针
} else {
next[i] = 0
i++
}
}
fmt.Println("next = ", next)
return next
}
func GetIndexOf(s string, m string) int {
sLen := len(s)
mLen := len(m)
if sLen < len(m) {
return -1
}
next := GetNextArray(m)
x := 0 //从来不回退
y := 0 //根据next数组回退
for x < sLen && y < mLen {
if s[x] == m[y] {
x++
y++
} else if next[y] == -1 {
x++
} else {
y = next[y] //回退了
}
}
if y == mLen {
return x - y
} else {
return -1
}
}

  

执行结果如下:

***

[力扣28. 实现 strStr()](https://leetcode-cn.com/problems/implement-strstr/)
[左神的KMP算法的java代码,我的golang代码参考了这个](https://github.com/algorithmzuo/algorithmbasic2020/blob/master/src/class27/Code01_KMP.java)

2021-02-03:手写代码:KMP算法。的更多相关文章

  1. .netER的未来路,关于基础是否重要和应该自己手写代码吗?

    http://www.cnblogs.com/onepiece_wang/p/5558341.html#!comments 引用"基础知识的学习,一开始可能是背书,但是在后续若干年的工作过程 ...

  2. ClownFish:比手写代码还快的通用数据访问层

    http://www.cnblogs.com/fish-li/archive/2012/07/17/ClownFish.html 阅读目录 开始 ClownFish是什么? 比手写代码还快的执行速度 ...

  3. 手写代码自动实现自动布局,即Auto Layout的使用

    手写代码自动实现自动布局,即Auto Layout的使用,有需要的朋友可以参考下. 这里要注意几点: 对子视图的约束,若是基于父视图,要通过父视图去添加约束. 对子视图进行自动布局调整,首先对UIVi ...

  4. 如果选择构建ui界面方式,手写代码,xib和StoryBoard间的博弈

    代码手写UI这种方法经常被学院派的极客或者依赖多人合作的大型项目大规模使用. 大型多人合作项目使用代码构建UI,主要是看中纯代码在版本管理时的优势,检查追踪改动以及进行代码合并相对容易一些. 另外,代 ...

  5. 手写代码UI,xib和StoryBoard间的的优劣比较

    在UI制作方面,逐渐分化三种主要流派:使用代码手写UI:使用单个xib文件组织viewController或者view:使用StoryBoard来通过单个或很少的几个文件构建UI.三种方式各有优劣,也 ...

  6. UI到底应该用xib/storyboard完成,还是用手写代码来完成?

    UI到底应该用xib/storyboard完成,还是用手写代码来完成? 文章来源:http://blog.csdn.net/libaineu2004/article/details/45488665 ...

  7. 2019前端面试系列——JS高频手写代码题

    实现 new 方法 /* * 1.创建一个空对象 * 2.链接到原型 * 3.绑定this值 * 4.返回新对象 */ // 第一种实现 function createNew() { let obj ...

  8. Appium初始化设置:手写代码连接手机、appium-desktop连接手机

    一.包名获取的三种方式 1)找开发要2)mac使用命令:adb logcat | grep START win使用命令:adb logcat | findstr START 或者可以尝试使用第3条命令 ...

  9. gcd手写代码及STL中的使用方法

    一.手写代码 inline int gcd(int x,int y){ if(y==0) return x; else return(gcd(y,x%y)); } 二.STL中的使用方法 注:在STL ...

  10. SpringCloud-Ribbon负载均衡机制、手写轮询算法

    Ribbon 内置的负载均衡规则 在 com.netflix.loadbalancer 包下有一个接口 IRule,它可以根据特定的算法从服务列表中选取一个要访问的服务,默认使用的是「轮询机制」 Ro ...

随机推荐

  1. 使用react-vite-antd,修改antd主题,报错 [vite] Internal server error: Inline JavaScript is not enabled. Is it set in your options? It is hacky way to make this function will be compiled preferentially by less

    一般报错 在官方文档中,没有关于vite中如何使用自定义主题的相关配置,经过查阅 1.安装less  yarn add less (已经安装了就不必再安装) 2.首先将App.css改成App.les ...

  2. FastJson参数

    名称 含义 备注 QuoteFieldNames 输出key时是否使用双引号,默认为true   UseSingleQuotes 使用单引号而不是双引号,默认为false   WriteMapNull ...

  3. Axios的js文件的下载教程+相关应用

    下载教程来啦! 1.进入GitHub网站,网址在这里:http://github.com 2.去搜索框搜索Axios,得到如下界面: 3.然后选择这里: 会出现如下界面: 4.点击右方的绿色按钮&qu ...

  4. pytorch的dataset与dataloader解析

    整理一下pytorch获取的流程: 创建Dataset对象 创建DataLoader对象,装载有dataset对象 循环DataLoader对象,DataLoader.__iter__返回的是Data ...

  5. java异常--自定义异常

    java异常--自定义异常 步骤: 创建自定义异常类. 在方法中通过throw关键字抛出异常对象. 处理异常try-catch 捕获并处理,否则在方法声明处通过throws关键字指明抛出给调用者的方法 ...

  6. 如何单机部署多个 MySQL 8.0 实例 ?

    在服务器资源有限的情况下,可利用该方案快速搭建各类 mysql 架构方案.各 MySQL 实例共享一个 mysqld 主程序,但各实例数据目录是独立的,存放在不同的文件夹中:好了.废话不多说,直接上干 ...

  7. GitHub+Typora实现云笔记一键上传

    git实现笔记自动上传功能 简介: 将更新内容自动上传同步git,无需手动提交,解锁一键式同步.流程大致为,创建新仓库,配置公钥和私钥,安装quicker软件,通过quicker上某脚本完成一键提交. ...

  8. Oracle_用户-授权-角色

    Oracle创建用户及表空间 1. 用户 创建用户: sql> create user <用户名> IDENTIFIED BY <用户密码> default tables ...

  9. GitLab服务器傻瓜式搭建教程

    开始前的准备 需要有一台Linux系统的服务器或虚拟机 QAQ 安装包下载地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ 注* 本教程无需下载安装 ...

  10. 人工智能NVIDIA显卡计算(CUDA+CUDNN)平台搭建

    NVIDIA是GPU(图形处理器)的发明者,也是人工智能计算的引领者.我们创建了世界上最大的游戏平台和世界上最快的超级计算机. 第一步,首先安装N卡驱动. cby@cby-Inspiron-7577: ...