KMP算法

作者: XGamer | 来源:发表于2020-09-09 21:54 被阅读0次

void GetNextval(string partStr, vector<int>& nextval)

{

int p_len = partStr.size();

//由 next[i] = j 得,也就是对于位置 i 来说,

//区段[0, i - 1] 的最长相同真前后缀分别是[0, j - 1] 和[i - j, i - 1],即这两区段内容相同。

int i = 0;  // P 的下标

int j = -1;

nextval[0] = -1;

while (i < p_len)

{

//  j == -1 存在的意义是何?

//  第一,程序刚运行时,j 是被初始为 -1,直接进行 P[i] == P[j] 判断无疑会边界溢出;

// 第二,else 语句中 j = next[j],j 是不断后退的,若 j 在后退中被赋值为 -1(也就是 j = next[0]),在 P[i] == P[j] 判断也会边界溢出。

// 综上两点,其意义就是为了特殊边界判断。

if (j == -1 || partStr[i] == partStr[j])

{

i++;

j++;

nextval[i] = j;

//为了防止出现ABCDAB 若在 i = 5 时匹配失败,此时应该把 i = 1 处的字符拿过来继续比较,

//但是这两个位置的字符是一样的,都是 B,既然一样,拿过来比较不就是无用功了么?

//所以将nextval[i] = j;优化,如果相同就继续往前找前缀

if (partStr[i] != partStr[j])

nextval[i] = j;

else

nextval[i] = nextval[j];  // 既然相同就继续往前找真前缀

}

else

j = nextval[j];

}

}

int  KMP(string mianStr, string partStr) {

int partLen = partStr.length();

vector<int> nextList(partLen+1,0);

GetNextval(partStr, nextList);

int i = 0;

int j = 0;

while (i < mianStr.length()&& j < partLen)

{

if (j==-1|| mianStr[i] == partStr[j])

{

i++;

j++;

}

else

{

j = nextList[j];

}

}

if (j == partLen)

{

return i - j;

}

return -1;

}

相关文章

  • 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/lwbyektx.html