博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
KMP算法总结
阅读量:5118 次
发布时间:2019-06-13

本文共 1876 字,大约阅读时间需要 6 分钟。

KMP是一个字符串匹配算法,他的关键部分就是对模式串进行预处理 ,加快字符串的匹配

KMP 最重要的一点就是     "构造最大后缀长度数组"

KMP 迭代部分异常重要

 

求next 指针方式有两种

一种是

void GetNext(char* p,int next[])  {      int pLen = strlen(p);      next[0] = -1;      int k = -1;  //从 -1  开始是为了避开 p[0] = p[0]这种情况    int j = 0;      while (j < pLen - 1)  // 这里可以直接循环到  pLen  的,那么 next[pLen] 就正好等于  pLen-1 这个位置后缀的与前缀相等的长度     {          //p[k]表示前缀,p[j]表示后缀          if (k == -1 || p[j] == p[k])           {              ++k;              ++j;              next[j] = k;          }          else           {              k = next[k];  //        }      }  }

这种写法适合求模式串出线次数

还有第二种写法

//优化过后的next 数组求法  void GetNextval(char* p, int next[])  {      int pLen = strlen(p);      next[0] = -1;      int k = -1;      int j = 0;      while (j < pLen - 1)      {          //p[k]表示前缀,p[j]表示后缀            if (k == -1 || p[j] == p[k])          {              ++j;              ++k;              //较之前next数组求法,改动在下面4行              if (p[j] != p[k])                  next[j] = k;   //之前只有这一行              else                  //因为不能出现p[j] = p[ next[j ]],所以当出现时需要继续递归,k = next[k] = next[next[k]]                  next[j] = next[k];          }          else          {              k = next[k];          }      }  }

这种优化版本不适合求循环节,匹配次数,只适合求是否匹配

 

然后就是KMP函数

int KmpSearch(char* s, char* p)  {      int i = 0;      int j = 0;      int sLen = strlen(s);      int pLen = strlen(p);      while (i < sLen && j < pLen)      {          //①如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++              if (j == -1 || s[i] == p[j])          {              i++;              j++;          }          else          {              //②如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]                  //next[j]即为j所对应的next值                    j = next[j];          }      }      if (j == pLen)          return i - j;      else          return -1;  }

 

转载于:https://www.cnblogs.com/zyue/p/3142643.html

你可能感兴趣的文章
Codeforces 719B Anatoly and Cockroaches
查看>>
关于TFS2010使用常见问题
查看>>
聚合与组合
查看>>
ionic2+ 基础
查看>>
Screening technology proved cost effective deal
查看>>
【2.2】创建博客文章模型
查看>>
大三上学期软件工程作业之点餐系统(网页版)的一些心得
查看>>
Java语言概述
查看>>
关于BOM知识的整理
查看>>
使用word发布博客
查看>>
GDOI DAY1游记
查看>>
MyBaits动态sql语句
查看>>
HDU4405(期望DP)
查看>>
拉格朗日乘子法 那些年学过的高数
查看>>
vs code 的便捷使用
查看>>
Spring MVC @ResponseBody返回中文字符串乱码问题
查看>>
用户空间与内核空间,进程上下文与中断上下文[总结]
查看>>
JS 中的跨域请求
查看>>
JAVA开发环境搭建
查看>>
mysql基础语句
查看>>