码迷,mamicode.com
首页 > 其他好文 > 详细

2019/4/22 kmp模板

时间:2019-04-22 18:04:08      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:ext   div   nbsp   https   输出   完整   不能   ref   获得   

题目连接:传送门!!!

这里是从头到尾彻底理解KMP的一篇博客,写的非常好 :https://blog.csdn.net/v_JULY_v/article/details/7041827

题意:输入多组样例,每组给定一个模板串S,文本串T,问S在T中出现的次数

这道题主要是为了记录一下kmp的模板, 我太菜了,不能彻底理解 ,先记着吧

 

void getnext() //获得next数组 
{
	next[0] = -1; 
	int j = 0, k = -1; 
	while(j < len1)
	{
		if(k == -1 || s1[j] == s1[k])
		{
			j ++, k ++;
			next[j] = k;
		}
		else
			k = next[k];
	}
}

  

void kmp()//输出出现次数 
{
	ans = 0;
	int j = 0, k = 0;
	while(k < len2)//遍历文本串 
	{
		if(j == -1 || s1[j] == s2[k])
		{
			j ++, k ++;
		}
		else
			j = next[j];//模式串移动距离相当于 next[j] 
		if(j == len1)//如果匹配到一次完整的模式串 ,出现次数++ 
		{
			ans ++;
			j = next[j]; //回到模式串开头位置,重新找在文本串中找 
		}
	}
	printf("%d\n", ans);
}

  

void kmp()//输出模式串在文本串中的各个位置 ,没找到输出-1 
{
	int flag = 0;
	int j = 0, k = 0;
	while(k < len2) //遍历文本串
	{
		if(j == -1 || s1[j] == s2[k])
		{
			j ++, k ++;
		}
		else
			j = next[j]; //回到上一个j位置字符的位置 
		if(j == len1)
		{
			if(!flag)
				printf("%d", k - j);
			else
				printf(" %d", k - j);
			flag = 1;
			j = next[j]; //回到模式串开头位置,重新找在文本串中找 
		}
	}
	if(!flag)
		printf("-1\n");
	else
		printf("\n");
}

  

2019/4/22 kmp模板

标签:ext   div   nbsp   https   输出   完整   不能   ref   获得   

原文地址:https://www.cnblogs.com/yuanweidao/p/10751560.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!