美文网首页数据结构和算法分析
字符串搜索子串的算法(KMP算法)

字符串搜索子串的算法(KMP算法)

作者: 赫尔特 | 来源:发表于2019-08-25 12:38 被阅读0次
菲洛

比如在字符串s:"a a a b"中搜索t:"a a b",

在比较s[2]!=t[2]后,下一次直接比较s[2]和t[1]是否相等,而不是从

s[1]和t[0]开始比较。即我们在第一次匹配中有部分信息有可能加

速我们的第二次匹配,第二次匹配没必要从t[0]开始比较。我们创

建一个长度为t.length的整数数组next,对于t中的每一个字符t[i],

next[i]表示字符t[i]之前有没有可以加速匹配的信息。具体表示是:

next[i]=\left\{ \begin{aligned} &max\{k|0<k<i,且"t_0t_1...t_{k-1}"="t_{i-k}t_{i-k+1}...t_{i-1}\} \\ &-1\ \ 当i=0时\\ &0 \ \ \ \ \ \ \ 其他情况时 \end{aligned} \right.
(注意上面的max里面i-k是大于0的)

next[i]字面意思是t[i]前面最多有k(k<t.length)个元素与从头开始

的k个元素相等,所以当s[j]!=t[i]时,接着直接让s[j]与t[next[i]]作比

较(因为下标是从0开始,不是1),如果直到next[i]=-1,依然不相等,那么就比较s[j+1]与t[0](最坏情况)

获取next数组的办法:

public void getNext(String str,int[]next) {
        int j,k;
        j=0;k=-1;next[0]=-1;
        int len=str.length();
        while(j<len-1) {
            if(k==-1||str.charAt(j)==str.charAt(k)) {
                ++j;++k;
                next[j]=k;
            }
            else k=next[k]; /*这里也是利用
            前面得到的next数组来加速循环过程*/
        }
    }

实际应用:题目

 public int strStr(String haystack, String needle) {
            int len=needle.length();
            int[]next=new int[len];
            if(len==0)
                 return 0;
            getNext(needle,next);
            int i=0,j=0,len2=haystack.length();
            while(i<len2) {
                if(j==-1||haystack.charAt(i)==needle.charAt(j)) {
                    ++j;
                    ++i;
                    if(j==len) {
                        return i-len;
                    }
                }
                else {
                    j=next[j];
                }
            }
            return -1;
        }

时间复杂度:
设s长度为n, t的长度为m。
则 求next数组复杂度为O(m),因为在匹配过程中s的下标不会减少,比较次数是n,这个算法的平均时间复杂度为O(n+m)。
最坏的时间复杂度为O(n x m)。

到现在还没看懂的话,原谅我的理解和表达能力,可以先放下,

过段时间再去思考。

相关文章

  • 算法:KMP算法

    提到字符串,就一定会提及响当当的KMP算法。KMP用于在字符串序列中检索子序列,是形式简单、内涵丰富的代表算法之一...

  • KMP算法文章合集

    字符串的查找:朴素查找算法和KMP算法 暴力匹配算法与KMP算法(串的匹配) 字符串查找算法BF和KMP 字符串匹...

  • 算法(2)KMP算法

    1.0 问题描述 实现KMP算法查找字符串。 2.0 问题分析 “KMP算法”是对字符串查找“简单算法”的优化。 ...

  • KMP算法——寻找子串位置

    KMP算法——寻找子串位置 1、KMP算法简介: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J....

  • leetcode字符串匹配算法之KMP算法

    本篇介绍一种高效的字符串匹配算法——KMP算法。 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J....

  • 字符串搜索子串的算法(KMP算法)

    比如在字符串s:"a a a b"中搜索t:"a a b", 在比较s[2]!=t[2]后,下一次直接比较s[2]...

  • KMP算法:求next数组,一听就会

    KMP算法是啥? KMP算法就是一种字符串匹配算法,简单说就是从一个长字符串中搜索一个短字符串(也叫模式串)。这个...

  • 字符串匹配与KMP算法

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

  • DS串应用--KMP算法

    关于KMP算法 字符串匹配算法,emmm,网上很多介绍,有兴趣的搜一搜就有了,直接上题吧~ 问题 A: DS串应用...

  • KMP算法(字符串匹配问题)

    一、是什么? 注意,是KMP算法,不是MMP哈,我没有骂人。KMP算法是用来做字符串匹配的,除了KMP算法分,还有...

网友评论

    本文标题:字符串搜索子串的算法(KMP算法)

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