作者在 2011-03-17 08:59:14 发布以下内容
#include<iostream>
using namespace std;
int jmpoftable[100][256];
void Greattable(const char* str, int lenght)//跳转表的建立
{
int i = 0;
for(const char *p = str; i<lenght; ++p,++i)
using namespace std;
int jmpoftable[100][256];
void Greattable(const char* str, int lenght)//跳转表的建立
{
int i = 0;
for(const char *p = str; i<lenght; ++p,++i)
{
jmpoftable[i][*p] = i+1;
}
for(int j = 1; j <= i; ++j)
{
int k = 0;
while(str[k] == str[k+j]) //找出第一个可以不匹配,但前面有k个字条相同,的位置(k+j)
++k;
// cout << k << endl;
if(k != 0)
{
if(jmpoftable[k+j][str[k]] < k+1) //str[k+j] == str[k]的话,就可以跳转至k+1。
jmpoftable[i][*p] = i+1;
}
for(int j = 1; j <= i; ++j)
{
int k = 0;
while(str[k] == str[k+j]) //找出第一个可以不匹配,但前面有k个字条相同,的位置(k+j)
++k;
// cout << k << endl;
if(k != 0)
{
if(jmpoftable[k+j][str[k]] < k+1) //str[k+j] == str[k]的话,就可以跳转至k+1。
jmpoftable[k+j][str[k]] = k+1;
}
if(jmpoftable[j][*str] == 0) //和一个字符相同都可以跳转到1,前提是没有更长的匹配
jmpoftable[j][*str] = 1;
}
}
int fun(int index, char c)
{
return jmpoftable[index][c];
}
int main()
{
char * cp = "ababababababab";
int key = 3;
Greattable("aba",key);
int p = 0;
while(*cp)
{
p = fun(p,*cp);
++cp;
if(p == key)
{
cout.write(cp-key,key);
cout << endl;
}
}
return 0;
}
}
if(jmpoftable[j][*str] == 0) //和一个字符相同都可以跳转到1,前提是没有更长的匹配
jmpoftable[j][*str] = 1;
}
}
int fun(int index, char c)
{
return jmpoftable[index][c];
}
int main()
{
char * cp = "ababababababab";
int key = 3;
Greattable("aba",key);
int p = 0;
while(*cp)
{
p = fun(p,*cp);
++cp;
if(p == key)
{
cout.write(cp-key,key);
cout << endl;
}
}
return 0;
}
我这个跳转表是根据模式字符串与它本身的比较。(str[k+j] 和str[j]的比较)
str1: lintaolinynlintao
str2: *lintaolinynlintao(k的大小就是`*`的数量,在搜寻str2的前缀字符串)
跳转表的建立没经过证明,不知道有没有错误。(我已经想不了了,脑袋都糊了)
期待高手们给指出问题,或者帮忙解释下算法导论里他的变迁表(跳转表)是什么建立的。