算法学习07:KMP算法

算法学习07:KMP算法


文章目录

  • 算法学习07:KMP算法
  • 前言
  • 一、KMP算法
  • 1.kmp匹配过程:
  • 2.求解next数组(kmp算法重点)
  • 3.代码
  • 总结


前言

算法学习07:KMP算法_第1张图片


提示:以下是本篇文章正文内容:

一、KMP算法

1.kmp匹配过程:

算法学习07:KMP算法_第2张图片



2.求解next数组(kmp算法重点)

算法学习07:KMP算法_第3张图片



3.代码

#include 

using namespace std;

const int N = 10000 + 10, m = 100000 + 10;

int n, m;
int p[N], s[N];//p:模版串, s:模式串 
int ne[N]; //ne:next数组,表示 最少前进几步,后缀和前缀可以匹配

int main()
{
	//s + 1:表示模式串 从索引1 开始 (看自己的习惯) 
	cin >> n >> p + 1 >> m >> s + 1;
	
	// 求next数组的过程:
	// j:表示匹配成功的位数 
	for(int i = 2, j = 0; i <= n; i ++)
	{
		// 推无可退、下一位匹配成功 
		while(j && p[i] != p[j + 1]) j = ne[j];
		if(p[i] == p[j + 1]) j ++;
		ne[i] = j;
	 } 
	 
	 // kmp 匹配过程:
	 for(int i = 1, j = 0; i <= m; i ++)
	 {
	 	while(j && s[i] != p[j + 1]) j = ne[j];
	 	if(s[i] = p[j + 1]) j ++;
	 	//匹配成功: 
	 	if(j == n)
	 	{
	 		printf("%d", i - n + 1);
	 		j = ne[j];//匹配成功,去寻找下一个子串 
		 }
	  } 
	return 0;
 } 

总结

提示:这里对文章进行总结:

你可能感兴趣的:(学习打卡,算法,学习,笔记,c++,开发语言)