KMP 算法实例详解

 更新时间:2017年07月27日 10:47:56   投稿:lqh  
这篇文章主要介绍了KMP 算法实例详解的相关资料,MP的关键是求出next的值、先预处理出next的值,需要的朋友可以参考下

KMP 算法实例详解

KMP算法,是由Knuth,Morris,Pratt共同提出的模式匹配算法,其对于任何模式和目标序列,都可以在线性时间内完成匹配查找,而不会发生退化,是一个非常优秀的模式匹配算法。

分析:KMP模板题、KMP的关键是求出next的值、先预处理出next的值、然后一遍扫过、复杂度O(m+n)

实例代码:

#include<stdio.h> 
#include<string.h> 
#define N 1000005 
int s[N]; 
int p[N]; 
int next[N]; 
int m,n; 
void getnext(){ 
 int j=0,k=-1; 
 next[0]=-1; 
 while(j<m){ 
  if(k==-1||p[j]==p[k]){ 
   j++; 
   k++; 
   next[j]=k; 
  } 
  else 
   k=next[k]; 
 } 
} 
int kmp(){ 
 int i=0,j=0; 
 getnext(); 
 while(i<n){ 
  if(j==-1||s[i]==p[j]){ 
   i++; 
   j++; 
  } 
  else 
   j=next[j]; 
  if(j==m) 
   return i; 
 } 
 return -1; 
} 
int main(){ 
 int t; 
 scanf("%d",&t); 
 while(t--){ 
  scanf("%d%d",&n,&m); 
  for(int i=0;i<n;i++) 
   scanf("%d",&s[i]); 
  for(int i=0;i<m;i++) 
   scanf("%d",&p[i]); 
  if(kmp()==-1) 
   printf("-1\n"); 
  else 
   printf("%d\n",kmp()-m+1); 
 } 
 return 0; 
} 

以上就是KMP 算法的实例详解本站关于数据结构和算法的文章还有很多,希望大家搜索查阅,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • C++迭代器失效问题及解决

    C++迭代器失效问题及解决

    这篇文章主要介绍了C++迭代器失效问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Qt图形图像开发曲线图表模块QChart库基本用法、各个类之间的关系说明

    Qt图形图像开发曲线图表模块QChart库基本用法、各个类之间的关系说明

    这篇文章主要介绍了Qt图形图像开发曲线图表模块QChart库基本用法、各个类之间的关系说明,需要的朋友可以参考下
    2020-03-03
  • 计时器的time_t和clock_t 的两种实现方法(推荐)

    计时器的time_t和clock_t 的两种实现方法(推荐)

    下面小编就为大家带来一篇计时器的time_t和clock_t 的两种实现方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • C++概念重载、覆盖、隐藏的使用说明

    C++概念重载、覆盖、隐藏的使用说明

    本篇文章介绍了,在C++中概念重载、覆盖、隐藏的使用分析说明。需要的朋友参考下
    2013-05-05
  • 详解C++之函数重载

    详解C++之函数重载

    这篇文章主要介绍了c++函数重载的相关知识,文章讲解的非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • C++实现顺序表的方法

    C++实现顺序表的方法

    本文给大家带来了C++实现顺序表的方法,代码简单易懂,附有注释,感兴趣的朋友一起看下吧
    2016-08-08
  • C++实现AVL树的完整代码

    C++实现AVL树的完整代码

    AVL树是高度平衡的而二叉树。它的特点是:AVL树中任何节点的两个子树的高度最大差别为1。 今天通过本文给大家分享C++实现AVL树的完整代码,感兴趣的朋友一起看看吧
    2021-06-06
  • C++中的strcmp函数

    C++中的strcmp函数

    strcmp函数是C++标准库中用于字符串比较的重要函数,在C++中,字符串比较是一项常见的操作,用于判断两个字符串是否相等或者大小关系,本文介绍C++中的strcmp函数,感兴趣的朋友一起看看吧
    2024-03-03
  • C语言根据协议分割获取字符串单元的实现代码

    C语言根据协议分割获取字符串单元的实现代码

    今天小编就为大家分享一篇关于C语言根据协议分割获取字符串单元的实现代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C++命令行解析包gflags的使用教程

    C++命令行解析包gflags的使用教程

    这篇文章主要给大家介绍了关于C++命令行解析包gflags的使用教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论