KMP算法模板

简介:

用自己的方法写出来了,下标很容易错。。。

其实感觉KMP算法还有改进的余地,因为 Pi[ ] 这个数组在计算的时候只会有两种情况:

1、要么碰到不等的数了,就为0

2、要么继续相等,就+1


#include <iostream>
#include <string.h>
using namespace std;

int Pi[100];  //最终的数组

/************************************************************************/
/* athor:Bill Wang                                                      */
/************************************************************************/


//计算每个子串的最大前缀pi
int count_max(char *P,int len)
{
	int i,j;
	//len是串长度
	for (i=len-1;i>=1;i--)
	{
		//从最乐观的开始,碰到一个可以的就返回
		for (j=1;j<=i;j++)
		{
			//这里只要匹配成功就可以返回了
			if (P[j] != P[len-i+j])
				break;
		}
		if(j>i)  //成功匹配
			return i;
	}
	return 0;
}



void Prefix_fun(char *P)
{
	//cout<<strlen(P)<<endl;
	int m=strlen(P);   //P的长度,这里是10
	Pi[1]=0;

	for(int q=2;q<=m;q++)
	{
		//已得到子串 如  abababa,计算其Pi
		Pi[q]=count_max(P,q);
	}

}



int main()
{
	char P[]="zababababca";

	Prefix_fun(P);

	for(int i=1;i<=10;i++)
		printf("%d ",Pi[i]);
	cout<<endl;

	while(1);

	return 0;
}


算导自带的算法:

#include <iostream>
#include <string.h>
using namespace std;

int Pi[100];  //最终的数组

void Prefix_fun(char *P)
{
	//cout<<strlen(P)<<endl;
	int m=strlen(P);   //P的长度,这里是10
	Pi[1]=0;
	int k=0;   //一个中间变量

	for(int q=2;q<=m;q++)
	{
		while( k>0 && P[k+1]!=P[q])
			k=Pi[k];

		if (P[k+1] == P[q])
			k++;

		Pi[q]=k;
	}

}



int main()
{
	char P[]="zababababca";

	Prefix_fun(P);

	for(int i=1;i<=10;i++)
		printf("%d ",Pi[i]);
	cout<<endl;

	while(1);

	return 0;
}






相关文章
|
4月前
|
算法
第四章 KMP算法理论基础
第四章 KMP算法理论基础
40 0
|
4月前
|
算法
KMP算法
KMP算法
54 0
|
6月前
|
算法 C++
A : DS串应用–KMP算法
这篇文章提供了KMP算法的C++实现,包括计算模式串的next数组和在主串中查找模式串位置的函数,用于演示KMP算法的基本应用。
|
6月前
|
算法
KMP算法
KMP算法
48 0
|
6月前
|
算法
【算法】前缀和——二维前缀和模板题
【算法】前缀和——二维前缀和模板题
|
7月前
|
设计模式 JavaScript 算法
vue2 原理【详解】MVVM、响应式、模板编译、虚拟节点 vDom、diff 算法
vue2 原理【详解】MVVM、响应式、模板编译、虚拟节点 vDom、diff 算法
222 0
|
7月前
|
算法 Java
KMP算法详解及其在字符串匹配中的应用
KMP算法详解及其在字符串匹配中的应用
|
7月前
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
172 1
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
8月前
|
人工智能 算法 BI
一篇文章讲明白KMP算法(俗称看毛片算法)
一篇文章讲明白KMP算法(俗称看毛片算法)
85 0
|
8月前
|
算法 Java
Java数据结构与算法:字符串匹配算法之KMP算法
Java数据结构与算法:字符串匹配算法之KMP算法

热门文章

最新文章