KMP

 1 func KMP(str, substr string) int {
2 if substr == "" {
3 return 0
4 }
5 strLen := len(str)
6 subLen := len(substr)
7 next := make([]int, subLen)
8 for i, j := 1, 0; i < subLen; i++ {
9 for j > 0 && substr[i] != substr[j] {
10 j = next[j-1]
11 }
12 if substr[i] == substr[j] {
13 j++
14 }
15 next[i] = j
16 }
17 for i, j := 0, 0; i < strLen; i++ {
18 for j > 0 && str[i] != substr[j] {
19 j = next[j-1]
20 }
21 if str[i] == substr[j] {
22 j++
23 }
24 if j == subLen {
25 return i - subLen + 1
26 }
27 }
28 return -1
29 }

Sunday

func Sunday(str, substr string) int {
if len(substr) == 0 {
return 0
}
strLen := len(str)
subLen := len(substr)
if subLen > strLen {
return -1
}
m := make(map[rune]int, 0)
for index, c := range substr {
m[c] = index
}
start, compareCount := 0, 0
for start+subLen <= strLen {
compareCount = 0
for str[start+compareCount] == substr[compareCount] {
compareCount++
if compareCount == subLen {
return start
}
}
checkIndex := start + subLen
var lastIndex int
if checkIndex < strLen {
lastIndex = m[rune(str[checkIndex])]
} else {
lastIndex = -1
}
if lastIndex != -1 {
start += subLen - lastIndex
} else {
start += start + subLen + 1
}
}
return -1
}

  

Go实现KMP和Sunday算法的更多相关文章

  1. BF、KMP、BM、Sunday算法讲解

    BF.KMP.BM.Sunday算法讲解 字串的定位操作通常称作串的模式匹配,是各种串处理系统中最重要的操作之一. 事实上也就是从一个母串中查找一模板串,判定是否存在. 现给出四种匹配算法包括BF(即 ...

  2. 字符串查找算法总结(暴力匹配、KMP 算法、Boyer-Moore 算法和 Sunday 算法)

    字符串匹配是字符串的一种基本操作:给定一个长度为 M 的文本和一个长度为 N 的模式串,在文本中找到一个和该模式相符的子字符串,并返回该字字符串在文本中的位置. KMP 算法,全称是 Knuth-Mo ...

  3. 文本比较算法三——SUNDAY 算法

    SUNDAY 算法描述: 字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上 ...

  4. 字符串匹配的sunday算法

    sunday算法核心思想:启发式移动搜索步长! SUNDAY 算法描述: 字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).这里介 ...

  5. Sunday算法(字符串查找、匹配)

    字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简单的 ...

  6. 字符串模式匹配sunday算法

    文字部分转自:http://www.cnblogs.com/mr-ghostaqi/p/4285868.html 代码是我自己写的 今天在做LeetCode的时候,碰到一个写字符串匹配的题目: htt ...

  7. 字符串匹配算法之Sunday算法

    字符串匹配查找算法中,最着名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简 ...

  8. sunday算法实现

    这个算法比其他的kmp  bm 好理解的太多,而且速度还很快. sunday思路是: 1,Sunday算法是Daniel M.Sunday于1990年提出的一种比BM算法搜索速度更快的算法.  2,S ...

  9. 数据结构 Sunday算法

    Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配算法.相对比较KMP和BM算法而言,简单了许多. Sunday算法的思想类似于BM算法中的坏字符思想,有点像其删减版.差 ...

  10. 字符串匹配 - sunday算法

    常见的字符串匹配算法有BF.KMP(教科书中非常经典的).BM.Sunday算法 这里主要想介绍下性能比较好并且实现比较简单的Sunday算法 . 基本原理: 从前往后匹配,如果遇到不匹配情况判断母串 ...

随机推荐

  1. Java中@Override

    Java中的@Override @Override是伪代码,是"覆盖","重写"的意思 (当子类继承父类时,不写@Override其实也是可以的.) 写了以后好 ...

  2. DotNetCore2.1使用GitLab通过阿里云自动构建镜像上传阿里云仓库在Docker运行

    操作步骤: 1.安装GitLab并添加项目(此处省略安装过程) 2.获取GitLab的Access Tokens 3.创建空的DotNetCore2.1 Api项目 4.项目添加Docker支持,文件 ...

  3. ansible自动化管理

    一图读懂ansible自动化运维 金山文档连接地址:https://www.kdocs.cn/view/l/cheHWG9tTEgN(可查看) __outline__ansible部署及说明参数说明& ...

  4. MNIST数据集output with shape [1, 28, 28] doesn't match the broadcast shape [3, 28, 28]

    transform = transforms.Compose([ transforms.ToTensor(), transforms.Lambda(lambda x: x.repeat(3,1,1)) ...

  5. cypress初探

    long long ago就已经被各大公众号洗脑这款神奇的工具,那我们一起来学习下吧(基础入门安装,边学习边记录,勿喷谢谢) 第一步:访问官方网站:https://www.cypress.io/ 第二 ...

  6. docker、Containerd ctr、crictl 区别

    简述 作为接替 Docker 运行时的 Containerd 在早在 Kubernetes1.7 时就能直接与 Kubelet 集成使用,只是大部分时候我们因熟悉 Docker,在部署集群时采用了默认 ...

  7. Vue2.0 双向绑定的原理与缺陷?

    原理 Object.defineProperty.getter.setter 标准回答 Vue响应式指的是:组件的data发生变化,立刻触发试图的更新 原理:Vue采用数据劫持结合发布者-订阅者模式的 ...

  8. ESLint未定义报错

    vue框架, ---   .eslintrc.js : module.exports = { root: true, env: { node: true }, 'extends': [ 'plugin ...

  9. js中的加法运算

  10. js获取各种高度的方法

    js获取各种高度的方法 源文章:https://www.cnblogs.com/MrzhangRecord/p/9185868.html 目录 js获取各种高度的方法 1.获取元素的高度 模板:htm ...