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;
}
个人拙见,欢迎讨论。