zoukankan      html  css  js  c++  java
  • KMP算法学习

    KMP是一种字符串的模式匹配算法

     如图我们需要实现T串匹配S串。绿色代表匹配成功,黄色代表开始出现匹配错误。

     在下一次匹配错误中我们把i设置为i-j+2 然后继续匹配,这是朴素的匹配方法

     我们这时候需要思考一个问题,能不能让匹配过程变得更快?让T多往后移动一点儿。

    我们需要引入最长公共前后缀概念。

     next数组代表j的下一个取值(之前我们将j取值为0)

    kmp算法实现

     int Index_KMP(SString S, SString T, int pos) {
         // 利用模式串T的next函数求T在主串S中的第pos个
         //字符之后的位置的KMP算法。其中,T非空,
         // 1≤pos≤StrLength(S)
         i = pos;   j = 1;
      while (i <= S[0] && j <= T[0]) {  //0下标存储字符串长度
         if (j = 0 || S[i] == T[j]) { ++i;  ++j; }  // 继续比较后继字符
         else  j = next[j];         // 模式串向右移动
         }
        if (j > T[0])  return  i-T[0];    // 匹配成功
        else return 0;
    } // Index_KMP
    

     

       void get_next(SString &T, int &next[] ) {
         // 求模式串T的next函数值并存入数组next
         i = 1;   next[1] = 0;   j = 0;
          while (i < T[0]) {
               if (j = 0 || T[i] == T[j])
                     {++i;  ++j; next[i] = j; }
               else  j = next[j];
          }
        } // get_next
    
    作者:LightAc
    出处:https://www.cnblogs.com/lightac/
    联系:
    Email: dzz@stu.ouc.edu.cn
    QQ: 1171613053
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    Largest Rectangle in Histogram
    Valid Sudoku
    Set Matrix Zeroes
    Unique Paths
    Binary Tree Level Order Traversal II
    Binary Tree Level Order Traversal
    Path Sum II
    Path Sum
    Validate Binary Search Tree
    新手程序员 e
  • 原文地址:https://www.cnblogs.com/lightac/p/12665405.html
Copyright © 2011-2022 走看看