我已经完成了一个用于字符串比较的程序,在编程网站上存在一个不匹配。它给了我错误的答案。我正在广泛地研究它,但我找不到我的代码失败的测试用例。有人可以提供我的代码失败的测试用例。我使用Boyer Moore Horspool k-mismatches算法进行了比较,因为它是最快的搜索算法
代码是这样的
int BMSearch_k(string text, string pattern, int tlen, int mlen,int pos)
{
int i, j=0,ready[256],skip2[256][mlen-1],neq;
for(i=0; i<256; ++i) ready[i] = mlen;
for(int a=0; a<256;a++) {
for(i = mlen;i>mlen-k;i--)
skip2[i][a] = mlen;
}
for(i = mlen-2;i>=1;i--) {
for(j=ready[pattern[i]]-1;j>=max(i,mlen-k);j--)
skip2[j][pattern[i]] = j-i;
ready[pattern[i]] = max(i,mlen-k);
}
j = mlen-1+pos;
//cout<<"\n--jafffa--\n"<<pos<<"+"<<mlen<<"="<<j<<endl;
while(j<tlen+k) {
//cout<<"\t--"<<j<<endl;
int h = j;
i=mlen-1;
int neq=0,shift = mlen-k;
while(i>=0&&neq<=k) {
//cout<<"\t--"<<i<<endl;
if(i>=mlen-k)
shift = min(shift,skip2[i][text[h]]);
if(text[h]!= pattern[i])
neq++;
i--;
h--;
}
if(neq<=k)
return j-1;
j += shift;
}
return -1;
}
答案 0 :(得分:2)
您没有正确初始化阵列,
int i, j=0,ready[256],skip2[256][mlen-1],neq;
for(i=0; i<256; ++i) ready[i] = mlen;
for(int a=0; a<256;a++) {
for(i = mlen;i>mlen-k;i--)
skip2[i][a] = mlen;
}
一方面,您将skip2
声明为256×(mlen-1)
数组,另一方面,您将其填充为(mlen+1)×256
数组。
在下一个循环中,
for(i = mlen-2;i>=1;i--) {
for(j=ready[pattern[i]]-1;j>=max(i,mlen-k);j--)
skip2[j][pattern[i]] = j-i;
ready[pattern[i]] = max(i,mlen-k);
}
在设置之前使用ready[pattern[i]]
。我不知道这些错误是否会导致测试用例失败,但很容易想象他们会这么做。
答案 1 :(得分:1)
如果丹尼尔的建议没有解决问题,那么还有一些看似奇怪的事情:
return j-1; // I would expect "return j;" here
这看起来很奇怪,好像你有k = 0,mlen = 1,那么j可以采取的最高值是tlen + k-1,因此最高的返回值是tlen-2。换句话说,将模式'a'与字符串'a'匹配将不会在位置0返回匹配。
另一个奇怪的是循环:
for(i = mlen-2;i>=1;i--) // I would expect "for(i = mlen-2;i>=0;i--)" here
在预处理过程中,您永远不会访问模式中的第一个字符(即不读取模式[0]),这似乎很奇怪。