前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >KMP(Knuth Morris Pratt)算法的Go语言实现

KMP(Knuth Morris Pratt)算法的Go语言实现

作者头像
ccf19881030
发布2020-10-28 14:08:34
8440
发布2020-10-28 14:08:34
举报
文章被收录于专栏:ccf19881030的博客

字符串匹配

BF(Brute force)算法

实现:每次向后移动一位进行匹配

RK(Rabin-Karp)算法

实现:将每组要匹配长度的字符串进行hash,再hash后的元素里找

BM(Boyer-Moore)算法

有两部分组成:并且是由大到小,倒着匹配 坏前缀:普通匹配只一位一位移动,移动规则为 si(坏字符的位置) xi(坏字符在匹配字符最后出现的位置) 都没有xi=-1 移动距离等于si-xi 好后缀:坏前缀有可能产生负数,所以还要利用好后缀来进行匹配,好后缀类似坏前缀如果匹配串中有和好后缀相同的子串 ,移动到最靠后的子串的位置,如果没有相同的子串,就需要在匹配的子串中,查找和前缀子串匹配最长的子串进行移动。

KMP(Knuth Morris Pratt)算法

实现:关键部分next数组,失效函数。next数据就是匹配串字符串最长匹配前缀和最长匹配后缀的关系。 KMP算法的Go语言实现代码如下:

代码语言:javascript
复制
package main

import "fmt"

func main() {
    a := "ababaeabacaaaaaddfdfdfdfdf"
    b := "aca"
    pos := Kmp(b, a)
    fmt.Println(pos)
}
func Kmp(needle string, str string) int {
    next := getNext(needle)
    fmt.Println(next)
    j := 0
    for i := 0; i < len(str); i++ {
        for j > 0 && str[i] != needle[j] {
            j = next[j-1] + 1
        }
        if str[i] == needle[j] {
            j++
        }
        if j == len(needle) {
            return i - j + 1
        }
    }
    return -1
}

func getNext(needle string) []int {
    var next = make([]int, len(needle))
    fmt.Println(next)
    next[0] = -1
    k := -1
    for i := 1; i < len(needle); i++ {
        for k != -1 && needle[k+1] != needle[i] {
            k = next[k]
        }
        if needle[k+1] == needle[i] {
            k++
        }
        next[i] = k
    }
    return next
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/10/21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 字符串匹配
  • BF(Brute force)算法
  • RK(Rabin-Karp)算法
  • BM(Boyer-Moore)算法
  • KMP(Knuth Morris Pratt)算法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档