C++版KMP算法

C++版KMP算法

我选用的是《大话数据结构》这本书来学习数据结构和算法的,这本书讲的很棒,它的例子大都是用C语言实现的,而我用的是C++。在学习了KMP算法后,就用c++实现了一下。其实也很简单,算法大体没有改变,只是有一些细节需要针对c++语言的特性修改一下。求next具体代码如下:

//C语言版本
void get_next(String T, int *next)
{
	int i = 1, j = 0;
 	next[1] = 0;
	while (i<T[0])
	{
		if (j == 0 || T[i] == T[j])
		{
			++i;
			++j;
			next[i] = j;
		}
		else
		{
			j = next[j];
		}
	}
}

这里面的String 是书中该章节讲的数据结构“串”,下面描述c++版本的。

\\c++版本
void get_next(string str, int *next)
{
	int i = 0, j = -1;
 	next[0] = -1;
	while (i<=str.length()-1)
	{
		if (j == -1 || str[i] == str[j])
		{
			++i;
			++j;
			next[i] = j;
		}
		else
		{
			j = next[j];
		}
	}
}

可以看到,算法大体上是一样的,由于c++实现了string这样的数据类型,所以就直接拿过来用了。那我们要做的就是用string来实现KMP。我们要清楚c++中的string 和《大话数据结构》这本书里实现的String还是有一定的区别,主要体现在该书中的String数据结构的0号下标里面放的是字符串的长度,而c++string类型则是从0号下标开始就存放字符了以字符串“abc”为例,它在两个数据结构存放的样子如下:
在这里插入图片描述
上面是该书中实现的数据结构存放"abc",下面是c++中string存放的"abc"。就抓住这一区别,对代码中表示下标的变量进行调整就可以了。完整的c++版本kmp算法如下:

#include<iostream>
#include<string>

using namespace std;

void get_next(string str, int *next)
{
	int i = 0, j = -1;
 	next[0] = -1;
	while (i<=str.length()-1)
	{
		if (j == -1 || str[i] == str[j])
		{
			++i;
			++j;
			next[i] = j;
		}
		else
		{
			j = next[j];
		}
	}
}

int Str_KMP(string mainstr, string substr, int pos)
{
	if (mainstr.length() < substr.length())
	{
		cout << "mainstr is too short! " << endl;
	}
	int next[256] = {0};
	get_next(substr, next);
	int i =pos, j = -1;
	int len_1 = mainstr.length(), len_2 = substr.length();
	while ((i<len_1)&&(j<len_2)&&(pos<=mainstr.length()-substr.length()))
	{
		if (j == -1 || mainstr[i] == substr[j])
		{
			++i;
			++j;
		}
		else
		{
			j = next[j];
		}
	}
	if (j == substr.length())
		return i - j;
	else
	{
		cout << "no matching" << endl;
		return 0;
	}
}

int main()
{
	string mainstr("abcabcabcabxabc"), substr("abcabx");
	int index = Str_KMPval(mainstr, substr, 2);
	cout << index << endl;
	return 0;
}

个人拙见,欢迎讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值