重写kmp_plus,发现有个kmp_index函数里while循环异常跳出,没有达到结束条件,居然神奇的跳出了循环,原因暂时不明,记录。
测试用例,主串为hehelahello,字串为hello
修改之前
#include<iostream>
#include<string>
using namespace std;
int kmp_index(string s, string t);
void get_next(string t, int next[]);
const int N = 100;
int main()
{
string s = "hehelahello", t = "hello";
cout<<kmp_index(s, t);
return 0;
}
int kmp_index(string s, string t)
{
int i = 0, j = 0;
int next[N];
get_next(t, next);
while(i <= s.length()-1 && j <= t.length()-1)
{
if(-1 == j || s[i] == t[j])
{
++i;
++j;
cout<<"i, j: "<<i<<" "<<j<<endl;
}
while(s[i] != t[j] && -1 != j)
{
j = next[j];
}
}
cout<<"i, j: "<<i<<" "<<j<<endl;
if(j == t.length())
return i-t.length();
else
return -1;
}
void get_next(string t, int next[])
{
int j = 1, k = 0;
next[0] = -1; next[1] = 0;
while(j <= (t.length()-1)-1)
{
if(t[j] == t[k])
{
if(t[j+1] != t[k+1])
next[j+1] = k+1;
else
next[j+1] = next[k+1];
cout<<j+1<<": "<<next[j+1]<<endl;
}
while(t[j] != t[k] && -1 != k)
{
k = next[k];
}
if(-1 == k)
{
next[j+1] = 0;
cout<<j+1<<": "<<next[j+1]<<endl;
}
++j;
++k;
}
}
修改之后
#include<iostream>
#include<string>
using namespace std;
int kmp_index(string s, string t);
void get_next(string t, int next[]);
const int N = 100;
int main()
{
string s = "hehelahello", t = "hello";
cout<<kmp_index(s, t);
return 0;
}
int kmp_index(string s, string t)
{
int i = 0, j = 0;
int next[N];
get_next(t, next);
while(i <= s.length()-1 && j <= t.length()-1)
{
if(s[i] == t[j])
{
++i;
++j;
cout<<"i, j: "<<i<<" "<<j<<endl;
}
else if(s[i] != t[j] && 0 == j)
++i;
else
j = next[j];
}
cout<<"i, j: "<<i<<" "<<j<<endl;
if(j == t.length())
return i-t.length();
else
return -1;
}
void get_next(string t, int next[])
{
int j = 1, k = 0;
next[0] = -1; next[1] = 0;
while(j <= (t.length()-1)-1)
{
if(t[j] == t[k])
{
if(t[j+1] != t[k+1])
next[j+1] = k+1;
else
next[j+1] = next[k+1];
cout<<j+1<<": "<<next[j+1]<<endl;
}
while(t[j] != t[k] && -1 != k)
{
k = next[k];
}
if(-1 == k)
{
next[j+1] = 0;
cout<<j+1<<": "<<next[j+1]<<endl;
}
++j;
++k;
}
}