美文网首页
kmp算法--字符串比较

kmp算法--字符串比较

作者: 明白已晚 | 来源:发表于2018-07-27 11:16 被阅读11次

常规的比较算法(朴素比较算法)

int NaiveStringSearch(string S, string P)
{
    int i = 0;    // S 的下标
    int j = 0;    // P 的下标
    int s_len = S.size();
    int p_len = P.size();
    while (i < s_len && j < p_len)
    {
        if (S[i] == P[j])  // 若相等,都前进一步
        {
            i++;
            j++;
        }
        else               // 不相等
        {
            i = i - j + 1;
            j = 0;
        }
    }
    if (j == p_len)        // 匹配成功
        return i - j;
    return -1;
}

因为朴素算法效率低采用,KMP比较算法
比如说字符串,T=“abcdex”
j 123456
模式串 abcdex
next[j] 0111111
再比如说 T=“abcabx”
j 123456
模式串 abcabx
next[j] 011123

KMP模式匹配算法的实现

void get_next(String T,int *next)
{
   int i,j;
   i=1;
   j=0;
  next[1]=0;
while(i<T[0])//这里T[0]表示串T的长度
{
   if(j==0||T[i]==T[j])//T[i]表示后缀的单个字符,T[j]表示前缀的单个字符
{
 ++i;
 ++j;
next[i]=j;
}
else
  j=next[j];//  j值回溯
}
}

//返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0.

int Index_KMP(String S,String T,int pos)
{
int i=pos;//i用于主串S当前位置的下表值,若pos不为1,则从pos位置开始匹配
int j=1;//用于子串T中当前位置的下标值,
int next[255];
get_next(T,next);
while(i<S[0]&&j<=T[0])//S[0]和T[0]都表示字符串长度
{
    if(j==0||S[i]==T[j])//俩个字母相等则继续
{
   ++i;
   ++j;
}
else
{
   j=next[j];//j退回到合适的位置,i值不变
}
}
if(j>T[0])
return i-T[0];
else
return 0;
}

改进版的kmp,即nextval数组值推导

void get_nextval(String T,int *nextval)
{
  int i,j;
  i=1;
  j=0;
 nextval[1]=0;
while(i<T[0])
{
   if(j==0||T[i]==T[j])
{
  ++i;
  ++j;
if(T[i]!=T[j])
  nextval[i]=j;
else
  nextval[i]=nextval[j];
}
else
     j=nextval[j];//若字符不同,则j值回溯
}
}

由于讲解太过于粗糙,仅供参考

相关文章

  • KMP算法文章合集

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

  • kmp算法--字符串比较

    常规的比较算法(朴素比较算法) 因为朴素算法效率低采用,KMP比较算法比如说字符串,T=“abcdex”j ...

  • 数据结构与算法14-字符串匹配与KMP

    什么是KMP KMP算法是在字符串匹配算法中比较绕的.主要是需要理解KMP中next数组求解的必要性以及j 的回溯...

  • 字符串匹配问题-KMP算法

    什么是KMP KMP算法是在字符串匹配算法中比较绕的.主要是需要理解KMP中next数组求解的必要性以及j 的回溯...

  • 算法(2)KMP算法

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

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

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

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

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

  • 字符串匹配与KMP算法

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

  • KMP算法理解

    文章大纲:1.KMP算法概念2.KMP算法中最核心的next[] 数组是如何生成的3.使用KMP算法 匹配字符串 ...

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

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

网友评论

      本文标题:kmp算法--字符串比较

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