当前位置: 首页 > news >正文

把网站放在wwwroot已经有一个包含文件的网站百度网站客服电话

把网站放在wwwroot已经有一个包含文件的网站,百度网站客服电话,做网站一屏的尺寸是,仿制网站建设前言 本文结合朱战立教授编著的《数据结构—使用c语言(第五版)》(以下简称为《数据结构(第五版)朱站立》)中4.4.2章节内容编写,KMP的相关概念可参考此书4.4.2章节内容。原文中代码是C语言&…

前言

本文结合朱战立教授编著的《数据结构—使用c语言(第五版)》(以下简称为《数据结构(第五版)朱站立》)中4.4.2章节内容编写,KMP的相关概念可参考此书4.4.2章节内容。原文中代码是C语言,本文改用Go语言编写,逻辑不变。

一、KMP介绍

‌KMP算法‌(Knuth-Morris-Pratt算法)是一种高效的字符串匹配算法,由D.E.Knuth、J.H.Morris和V.R.Pratt提出。该算法的核心在于利用匹配失败后的信息,尽量减少模式串与主串的匹配次数,以达到快速匹配的目的。KMP算法的时间复杂度为O(m+n),其中m和n分别代表模式串和主串的长度。

二、求next数组

next数组是KMP算法中核心概念,求出next数组后,在模式串元素和主串元素比较的失败的时候,可以将模式串t直接偏移到以next数组中的元素为下标的位置,主串指针不偏移,减少了元素比较次数,下面我们直接求next数组

举例

字符串s=“ababbababcabac”
模式串t=“ababcab”
go语言版求next数组的代码如下:

func GetNext(s string) []int {var next []int = make([]int, len(s))next[0] = -1next[1] = 0// j表示当前要求next值的位置// k表示当前要和前一个字符比对的下标j, k := 1, 0for j < len(s)-1 {if s[j] == s[k] {next[j+1] = k + 1k++j++} else if k == 0 {next[j+1] = 0j++} else {k = next[k]}}return next
}

执行上面代码我们能获取到next数组如下:

PS D:\Project\GoWorkSpace\DataStructure> go run .\0113\KMP_Algorithm.go
[-1 0 0 1 2 0 1]

注:以上代码的变量名称,逻辑均与《数据结构(第五版)朱站立》中内容一致,方便代码阅读

三、图解KMP匹配过程

中间部分循环过程省略,主要看当模式串和主串不相等时,模式串如何偏移
字符串s=“ababbababcabac”
模式串t=“ababcab”
next数组=[-1 0 0 1 2 0 1]
在这里插入图片描述
第一步:s数组元素和t数组元素一一对比,如果成功两个数组下标偏移同时+1继续比较,以此类推
在这里插入图片描述
第二步:当s[4]≠t[4]时,next[4]=2,s数组不偏移,t数组偏移到t[2],比较s[4]和t[2]
在这里插入图片描述
第三步:当s[4]≠t[2]时,next[2]=0,s数组不偏移,t数组偏移到t[0],比较s[4]和t[0]
在这里插入图片描述
第四步:当s[4]≠t[0]时,由于t数组已经到第一位,所以s数组下标+1,比较s[5]和t[0]
在这里插入图片描述
第五步:当s[5]=t[0]时,回到了第一步,两个数组下标偏移同时+1继续比较,以此类推;当t的下标为7时s的下标为12,循环结束打印t的第一个元素在s中下标的位置,即:12-7=5

四、Go示例代码

package mainimport "fmt"func KMP(s string, t string) int {m := len(s)n := len(t)// s中当前比对的位置是i// t中当前比对的位置是ji, j := 0, 0next := GetNext(t)for i < m && j < n {if s[i] == t[j] {i++j++} else if j == 0 {i++} else {j = next[j] // t串偏移,偏移到next[j]下标}}if j == n { // t串全部匹配return i - j} else {return -1}
}
func GetNext(s string) []int {var next []int = make([]int, len(s))next[0] = -1next[1] = 0// j表示当前要求next值的位置// k表示当前要和前一个字符比对的下标j, k := 1, 0for j < len(s)-1 {if s[j] == s[k] {next[j+1] = k + 1k++j++} else if k == 0 {next[j+1] = 0j++} else {k = next[k]}}return next
}
func main() {t := "ababcab"fmt.Println(GetNext(t))fmt.Println(KMP("ababbababcabac", t))
}

运行结果

PS D:\Project\GoWorkSpace\DataStructure> go run .\0113\KMP_Algorithm.go
[-1 0 0 1 2 0 1]
5
http://www.zhongyajixie.com/news/48499.html

相关文章:

  • 深圳 网站设上海网站建设制作
  • 做简单网站的框架图google搜索优化方法
  • 有路由器做网站百度指数批量查询工具
  • 海口制作手机网站seo平台优化
  • 网站推广软文代发热点事件
  • 赌博网站开发公司正规接单赚佣金的app
  • 做网站用虚拟机还是服务器竞价托管sem服务
  • 中色十二冶金建设集团有限公司网站如何实施网站推广
  • 苹果手机怎么做ppt下载网站百度网盘优化
  • 做网站应该怎么做新手如何找cps推广渠道
  • 汕头做网站优化公司今日刚刚发生的重大新闻
  • 网站logo设计创意竞价账户托管公司
  • wordpress优化css做网络优化哪家公司比较好
  • 湖南营销型网站建设企业培训学校管理制度大全
  • 西安有哪些网站建设公司百度客户电话
  • 二级域名网站价格谷歌优化培训
  • 盐城网站建设费用网站排名优化化快排优化
  • 网站导航设计技巧自动seo系统
  • 如何加强精神文明网站建设内容seo基础知识培训视频
  • 政务内网网站建设方案百度收录量
  • 网站宣传怎么做搜索引擎优化百度
  • 学网站开发工作好找吗怎样精选关键词进行网络搜索
  • php asp jsp 网站seo公司重庆
  • 织梦模板下载商城网站模板(高端大气上档次:带数据)搜索引擎免费下载
  • 爱前端wordpress5.0.3主题seo零基础视频教程
  • 开发网站的技术路线国内十大4a广告公司
  • springboot企业网站开发seo点击排名源码
  • o2o网站建设方案营销策划与运营
  • 百度建设网站的目的网站seo优化检测
  • 公司宣传册设计样本百度网盘百度seo排名优化联系方式