美文网首页
009 go 语言 实现 KMP 模式匹配算法

009 go 语言 实现 KMP 模式匹配算法

作者: 愚蠢的二师弟 | 来源:发表于2020-04-06 20:48 被阅读0次

KMP 算法

参考资料
B站, 印度小哥写的 汪汪都能看懂的KMP算法
印度小哥的代码的github地址

建议多看几遍

本来写了点, 但是觉得写得不好, 又没图, 所以还是删了。

下面是go 语言实现的代码

package main

import (
    "fmt"
)

func main() {
    mainString :="abcxabcdabxabcdabcdabcy"
    // subString := "abcdab";
    // subString :="abcdabc"
    subString :="abcdabcy"
    next := computeNextArray(subString);
    fmt.Println("next----", next)
    idx := KMP(mainString, subString);
    fmt.Println("子串在主串中第一次出现的位置", idx)
}


/**
KMP 
**/
func  KMP(mainString string, subString string) int{
    mainIdx :=0;
    subIdx :=0;
    mainLen :=len(mainString)
    subLen := len(subString)
    next := computeNextArray(subString);
    for  {
        if mainIdx>=mainLen  || subIdx >= subLen{
            //当子串匹配完, 说明主串中包含子串, 需要结束
            //当主串匹配完, 不管子串有没有结束, 都应该不再匹配
            break;
        }

        if mainString[mainIdx] == subString[subIdx]{
            //字符匹配的时候, 主串和子串都往后走
            mainIdx ++;
            subIdx ++;
        }else{
            //不相等的时候, 子串切换到next数组中对应的前一个元素对应的, 需要位移的下标, 进行重新匹配
            if subIdx != 0{
                subIdx = next[subIdx-1]
            }else{
                //当主串元素与子串元素不一样, 且子串回退到了首字符时, 检查主串的下一个字符
                mainIdx++
            }

        }
    }

    //判断结果
    if subIdx>=subLen{
        //说明子串匹配完了, 子串在主串中存在
        return mainIdx - subLen
    }
    //其他情况下, 说明子串没走完, 返回 -1
    return -1

}



//computeNextArray 用于计算子串的 next 数组
func computeNextArray(subString string) []int {
    next := make([]int, len(subString))
    index :=0; 
    i := 1;
    for i < len(subString){
        if subString[i] == subString[index]{
            next[i] = index + 1
            i ++ ;
            index ++;
        }else{
            //不相等的时候
            if index != 0{
                //当index != 0 的时候, 把 next 中, index 前一个元素对应的 next中的值, 赋给 index  
                index = next[index -1]
            }else{
                //当index = 0 的时候,  subString[i] 和 subString[0] , 也就是subString 首字母不相同, 则i向后走
                i++
            }
        }
    }
    return next
}



相关文章

  • 009 go 语言 实现 KMP 模式匹配算法

    KMP 算法 参考资料B站, 印度小哥写的 汪汪都能看懂的KMP算法印度小哥的代码的github地址 建议多...

  • 5.字符串--大话数据结构

    定义 是由零个或多个字符组成的有限序列 Index的实现算法 朴素的模式匹配算法 KMP模式匹配算法 next[j...

  • KMP算法理解

    KMP的由来 在KMP算法之前,对文本进行匹配时使用的是朴素模式匹配算法,也就是最简单匹配算法.当然运行效率也是让...

  • 字符串匹配算法

    KMP算法 算法介绍 KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。...

  • KMP(二) 模式匹配算法实现

    概述:本文主要在代码层面上分析KMP的实现过程,如果您还不了解KMP的推导过程,请参考KMP(一) 模式匹配算法推...

  • KMP(三) 字符串快速匹配示例

    概述:本文主要讲解KMP实现字符串快速查找的一个Demo;不了解KMP的同学可以参考:KMP(一) 模式匹配算法推...

  • 字符串匹配与KMP算法

    1.朴素字符串匹配算法 2.KMP算法 求前缀函数 实现KMP算法 3.测试代码

  • 09--KMP

    [toc] KMP算法原理 KMP思想 假设字符串abcdefgab和模式串abcdex,进行匹配,当匹配到x位置...

  • KMP算法讲解

    KMP 算法 : 模式匹配算法 主要应用于 字符串的匹配。9月21日更新

  • 数据结构与算法-KMP算法

    KMP模式匹配算法原理 我们首先从原理上分析一下,KMP算法哪里比朴素算法好。假设主串S="abcdefgab",...

网友评论

      本文标题:009 go 语言 实现 KMP 模式匹配算法

      本文链接:https://www.haomeiwen.com/subject/wjpsphtx.html