• KMP算法 ← C++实现


    【KMP算法简介】
    KMP算法是由克努特(Knuth)、莫里斯(Morris)和普拉特(Pratt)共同设计实现的,因此简称KMP算法。此算法可以在
    O(n+m)的时间数量级上完成串的模式匹配操作。KMP算法中模式串T的next数组,是KMP算法的核心。
    KMP算法中的
    next数组仅取决于模式串本身,而与相匹配的主串无关
    next数组的核心作用是“
    当模式串T的第j位与主串S的第pos位失配时(即 T[j]≠S[pos] 时),让模式串T的第next[j]位与主串S的第pos位再进行比较”。这相当于让模式串T往右移动了 j-next[j] 位后,再进行比较。

    【KMP算法步骤】
    KMP算法本身并不复杂,但绝大部分的文章把它讲混乱了,以致造成很多混淆。KMP算法主要分为两步:求next[ ]数组、匹配字符串。
    一、求next[ ]数组
    由于字符串的下标从0开始,因此在KMP算法的设计中,将模式串下标从0开始计数,是很自然的事情。据此,可定义next[0]=-1,next[1]=0。之后,按照“
    (1)若第i-1位的字符与第j位的字符相等,则next[i]=j+1; (2)若直到第0位依然没有字符与第i-1位的字符相等,则next[i]=0”构建next数组。

    最后,利用循环体中的语句 cout<cout< 便可。

    二、匹配字符串
    此步主要体现了next()数组的核心作用,即“
    当模式串T的第j位与主串S的第pos位失配时(即 T[j]≠S[pos] 时),让模式串T的第next[j]位与主串S的第pos位再进行比较”。这相当于让模式串T往右移动了 j-next[j] 位后,再与主串进行比较。

    【KMP算法代码】

    1. #include
    2. using namespace std;
    3. const int maxn=100;
    4. int ne[maxn];
    5. void getNext(string s) {
    6. int len=s.length();
    7. int i=0, j=-1;
    8. ne[0]=-1;
    9. while(i
    10. if(j==-1 || s[i]==s[j]) {
    11. i++;
    12. j++;
    13. ne[i]=j;
    14. } else j=ne[j];
    15. }
    16. }
    17. int KMP(string S,string T) {
    18. int lens=S.length();
    19. int lent=T.length();
    20. int i=0;
    21. int j=0;
    22. while(i
    23. if(j==-1 || S[i]==T[j]) {
    24. i++;
    25. j++;
    26. } else j=ne[j];
    27. }
    28. if(j==lent) return i-j+1;
    29. else return -1;
    30. }
    31. int main() {
    32. string S,T;
    33. getline(cin,S);
    34. getline(cin,T);
    35. getNext(T);
    36. cout<<KMP(S,T)<
    37. return 0;
    38. }
    39. /*
    40. input:
    41. i love china.
    42. e c
    43. output:
    44. 6
    45. */


    【参考文献】
    https://blog.csdn.net/hnjzsyjyj/article/details/127086502

    https://blog.csdn.net/hnjzsyjyj/article/details/127105603

     

  • 相关阅读:
    【补充】Java程序设计接口实验作业
    嵌入式中I2C 相关的硬件问题汇总及死锁解决办法
    【CSS】基础CSS样式属性
    高数_证明_方向导数计算公式
    BlueToolFixup.kext2.6.5(所有蓝牙部分驱动)
    【云原生之kubernetes实战】安装kubeopertor教程
    DBConvert Studio All Editions 3.0.6 Crack
    1636. 按照频率将数组升序排序-c语言自定义二重排序
    windbg正确搜索堆上和栈上内存方法
    C语言参数类型
  • 原文地址:https://blog.csdn.net/hnjzsyjyj/article/details/127112363