KMP算法

作者: jas_go | 来源:发表于2019-10-09 11:49 被阅读0次
//求next 列表
int * StringNext(string p)
{
    int *next=new int[p.length()];
    int k=-1;
    int j=0;
    next[0]=-1;
    while(j<p.length()-1)
    {
        if(k==-1||p[j]==p[k])
            next[++j]=++k;
        else
            k=next[k];
    }
    return next;
}
int FindString(string T, string p)
{
    int * next=StringNext(p);
    int i=0, j=0;
    while(i<T.length()&&j<p.length())
    {
        if(T[i]==p[j])
        {
            i++;
            j++;
            continue;
        }
        if(j==0) // j为初始位置,移动i
            i++;
        else //否则移动j
            j=next[j];
        
    }
    if (j==p.length())
        return i-j;
    else
        return -1;
}

string a1="abcabaaaabaabcac";
string a2="abaabcac";

int rlt = FindString(a1, a2);
// 结果为8
//KMP算法,加了可视化匹配过程
int FindString(string T, string p)
{
    int * next=StringNext(p);
    int i=0;
    int j=0;
    int k=0;
    cout<<T.length()<<"::::"<<p.length()<<endl;
    while(i<T.length()&&j<p.length())
    {
        cout<<"T["<<j<<"]"<<"<->"<<"p["<<i<<"]"<<endl;
        for(k=0;k<T.length();k++)
        {
            if(k==i)
            {
                cout<<"<"<<T[k]<<">";
            }
            else
                cout<<T[k];
        }
        cout<<endl;
        for(k=0;k<i-j;k++)cout<<" ";
        for(k=0;k<p.length();k++)
        {
            if(k==j)
            {
                cout<<"<"<<p[k]<<">";
            }
            else
                cout<<p[k];
        }
        cout<<endl;
        cout<<endl;
        if(T[i]==p[j])
        {
            i++;
            j++;
            continue;
        }
        if(j==0) // j为初始位置,移动i
            i++;
        else //否则移动j
            j=next[j];
        
    }
    cout<<j<<"<->"<<i<<endl;
    if (j==p.length())
        return i-j;
    else
        return -1;
}

匹配过程

16::::8
T[0]<->p[0]
<a>bcabaaaabaabcac
<a>baabcac

T[1]<->p[1]
a<b>cabaaaabaabcac
a<b>aabcac

T[2]<->p[2]
ab<c>abaaaabaabcac
ab<a>abcac

T[0]<->p[2]
ab<c>abaaaabaabcac
  <a>baabcac

T[0]<->p[3]
abc<a>baaaabaabcac
   <a>baabcac

T[1]<->p[4]
abca<b>aaaabaabcac
   a<b>aabcac

T[2]<->p[5]
abcab<a>aaabaabcac
   ab<a>abcac

T[3]<->p[6]
abcaba<a>aabaabcac
   aba<a>bcac

T[4]<->p[7]
abcabaa<a>abaabcac
   abaa<b>cac

T[1]<->p[7]
abcabaa<a>abaabcac
      a<b>aabcac

T[0]<->p[7]
abcabaa<a>abaabcac
       <a>baabcac

T[1]<->p[8]
abcabaaa<a>baabcac
       a<b>aabcac

T[0]<->p[8]
abcabaaa<a>baabcac
        <a>baabcac

T[1]<->p[9]
abcabaaaa<b>aabcac
        a<b>aabcac

T[2]<->p[10]
abcabaaaab<a>abcac
        ab<a>abcac

T[3]<->p[11]
abcabaaaaba<a>bcac
        aba<a>bcac

T[4]<->p[12]
abcabaaaabaa<b>cac
        abaa<b>cac

T[5]<->p[13]
abcabaaaabaab<c>ac
        abaab<c>ac

T[6]<->p[14]
abcabaaaabaabc<a>c
        abaabc<a>c

T[7]<->p[15]
abcabaaaabaabca<c>
        abaabca<c>

8<->16

相关文章

  • KMP 专题整理

    KMP 学习记录 kuangbin专题十六——KMP KMP 学习总结 朴素 KMP 算法 拓展 KMP 算法(E...

  • 对KMP算法的一些理解

    最近学到KMP算法,下面讲讲对KMP算法的一些个人理解,希望对大家有帮助! 对于KMP算法的理解: 整个KMP算法...

  • KMP算法文章合集

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

  • 串的模式匹配算法

    KMP算法 算法匹配

  • 问答|KMP算法学习笔记

    问题 目录KMP是什么,做什么用的KMP算法的高效体现在哪如何KMP算法的next数组KMP的代码KMP的时间复杂...

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

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

  • 字符串匹配 - KMP算法

    前面我们介绍非常高效的 BM 算法,今天我们介绍另一个非常出名且高效的 KMP 算法。 KMP 算法思想 KMP ...

  • KMP算法及优化

    转载请注明出处: KMP算法及优化 今天看到同学在复习数据结构书上的KMP算法,忽然发觉自己又把KMP算法忘掉了,...

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

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

  • KMP算法

    KMP算法

网友评论

      本文标题:KMP算法

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