Go实现KMP和Sunday算法
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算法的更多相关文章
- BF、KMP、BM、Sunday算法讲解
BF.KMP.BM.Sunday算法讲解 字串的定位操作通常称作串的模式匹配,是各种串处理系统中最重要的操作之一. 事实上也就是从一个母串中查找一模板串,判定是否存在. 现给出四种匹配算法包括BF(即 ...
- 字符串查找算法总结(暴力匹配、KMP 算法、Boyer-Moore 算法和 Sunday 算法)
字符串匹配是字符串的一种基本操作:给定一个长度为 M 的文本和一个长度为 N 的模式串,在文本中找到一个和该模式相符的子字符串,并返回该字字符串在文本中的位置. KMP 算法,全称是 Knuth-Mo ...
- 文本比较算法三——SUNDAY 算法
SUNDAY 算法描述: 字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上 ...
- 字符串匹配的sunday算法
sunday算法核心思想:启发式移动搜索步长! SUNDAY 算法描述: 字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).这里介 ...
- Sunday算法(字符串查找、匹配)
字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简单的 ...
- 字符串模式匹配sunday算法
文字部分转自:http://www.cnblogs.com/mr-ghostaqi/p/4285868.html 代码是我自己写的 今天在做LeetCode的时候,碰到一个写字符串匹配的题目: htt ...
- 字符串匹配算法之Sunday算法
字符串匹配查找算法中,最着名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简 ...
- sunday算法实现
这个算法比其他的kmp bm 好理解的太多,而且速度还很快. sunday思路是: 1,Sunday算法是Daniel M.Sunday于1990年提出的一种比BM算法搜索速度更快的算法. 2,S ...
- 数据结构 Sunday算法
Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配算法.相对比较KMP和BM算法而言,简单了许多. Sunday算法的思想类似于BM算法中的坏字符思想,有点像其删减版.差 ...
- 字符串匹配 - sunday算法
常见的字符串匹配算法有BF.KMP(教科书中非常经典的).BM.Sunday算法 这里主要想介绍下性能比较好并且实现比较简单的Sunday算法 . 基本原理: 从前往后匹配,如果遇到不匹配情况判断母串 ...
随机推荐
- 优秀PHP程序员技术成长之路
按照了解的很多PHP/LNMP程序员的发展轨迹,结合个人经验体会,抽象出很多程序员对未来的迷漫,特别对技术学习的盲目和慌乱,简单梳理了这个每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定 ...
- TypeError: 'int' object is not subscriptable 报错
Python中报错TypeError: 'int' object is not subscriptable 原因:整形数据中加了下标索引 例如 #python utf-8 a = 10 b = a[0 ...
- 1.1 创建一个WCF应用程序服务
第一步:引入System.ServiceModel.dll 第二步 定义一个WCF接口: //定义接口 [ServiceContract] interface IGetInfo { [Operatio ...
- 深入理解 JVM -- 垃圾收集器与内存分配策略
程序计数器.虚拟机栈.本地方法栈 3个区域随线程而生,随线程而灭:栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作.每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的(尽管在运行 ...
- nohup原理
Nohup的原理也很简单,终端关闭后会给此终端下的每一个进程发送SIGHUP信号,而使用nohup运行的进程则会忽略这个信号,因此终端关闭后进程也不会退出. Linux的信号 SIGHUP:当用户退出 ...
- TensorFlow学习报告
TensorFlow简介 是一个基于计算图的深度学习库,具有更广泛的应用领域.良好的多语言支持.部署性能等优点,时现今最广泛使用的深度学习框架. 计算图Session Tensor 1 import ...
- OnlyOffice调用逻辑
- 支持批量图片转文字的【OCR】文字识别工具,支持截图识别,速度快,准确度高,免费OCR,开源软件
想必大家偶尔也有需要从图片中提取文字的需求,虽然现在手机上都自带了拍照识别功能,可是从电脑上的图片传到手机识别再将结果发回来实 在是有点麻烦,尤其当图片数量较多时,更是费时费力,使用网页版工具又要面临 ...
- React自定义组件参数小驼峰命名提示警告 Warning: React does not recognize the `xxXxx` prop on a DOM element.
Warning: React does not recognize the `xxXxx` prop on a DOM element. If you intentionally want it to ...
- VS2010查看DLL导出函数的方法
在window下查看动态库的导出函数可以用vs自带的Dependenc工具:对于VC6.0,VC所带的Depends软件,在VC6安装目录下的tools文件夹里面,可以直接运行. VS2010中没有了 ...