KMP算法,无解释,仅代码

淳属虚构 · · 1670 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

KMP算法(摘自百度百科):KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度为O(m+n)。

如何学习:
我看的是B站UP主正月点灯笼的视频教程,以及知乎上一位大佬的回答,及另外CSDN上的代码作为参考
视频教程一
视频教程二
知乎回答
CSDN代码参考

JAVA实现版本一(自己手写,很乱,建议看下一个版本)

public class KMP {
    static int[] getNext(String t) {
        int next[]=new int[t.length()];
        next[0] = -1;
        next[1] = 0;
        int i = 2;
        int j = 0;
        while (i < t.length()) {
            if (t.charAt(i - 1) == t.charAt(j)) {
                j++;
                next[i] = j;
                i++;
            } else {
                j = next[j];
                if (j == -1) {
                    j++;
                    next[i] = j;
                    i++;
                }
            }
        }
        return next;
    }

    static int KMPSearch(String target,String text){
        int[] next = getNext(target);
        int i=0;
        int j=0;
        while(j<text.length()){
            if (target.charAt(i)==text.charAt(j)){
                if (i==target.length()-1){
                    return j-i;
                }else{
                    i++;
                    j++;
                }
            }else{
                i=next[i];
                if (i==-1){
                    i++;
                    j++;
                }
            }
        }
        return -1;
    }
}

JAVA实现版本二(取自CSDN博客上的,稍作改动,个人觉得代码非常简洁)

public class KMP {
    static int[] getNext(String s){
        int next[]=new int[s.length()];
        next[0]=-1;
        int i=0;
        int j=-1;
        while(i<s.length()-1){
            if (j==-1||s.charAt(i)==s.charAt(j)){
                i++;
                j++;
                next[i]=j;
            }else{
                j=next[j];
            }
        }
        return next;
    }
    static int KMPSearch(String target,String text){
        int i=0;
        int j=0;
        int[] next = getNext(target);
        while(j<text.length()){
            if (i==target.length()-1&&target.charAt(i)==text.charAt(j)){
                return j-i;
            }
            if(j==-1 || target.charAt(i)==text.charAt(j)){
                i++;
                j++;
            }else{
                i=next[i];
            }
        }
        return (-1);
    }
}

GoLang实现:

func getNext(s string) []int {
    next:=make([]int,len(s))
    next[0]=-1
    i,j:=0,-1
    for ; i< len(s)-1;  {
        if j==-1||s[i]==s[j] {
            i++
            j++
            next[i]=j
        }else {
            j=next[j]
        }
    }
    return next
}
func KMPSearch(target string,text string) int {
    i,j:=0,0
    next := getNext(target)
    for ; j< len(text);  {
        if i==len(target)-1&&target[i]==text[j] {
            return j-i
        }
        if j==-1||target[i]==text[j] {
            i++
            j++
        }else {
            i=next[i]
        }
    }
    return -1
}

Python实现:

def get_next(s):
    nex = [-1]
    i, j = 0, -1
    while i < len(s)-1:
        if j == -1 or s[i] == s[j]:
            i = i+1
            j = j+1
            nex.append(j)
        else:
            j = nex[j]
    return nex


def kmp_search(tar, text):
    i, j = 0, 0
    ne = get_next(tar)
    while j < len(text):
        if i == len(tar)-1 and tar[i] == text[j]:
            return j-i
        if j == -1 or tar[i] == text[j]:
            i = i+1
            j = j+1
        else:
            i = ne[i]
    return -1

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:淳属虚构

查看原文:KMP算法,无解释,仅代码

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1670 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传