我使用node.js编码了Boyer-Moore horspool字符串匹配算法。该程序有效,但总是输出-1,如果模式字符串不在指定的文本中,它应该输出。
我无法弄清楚我的生活中有什么不起作用,而且我非常感谢我需要解决的问题。
我的代码
var horsPool = function(sText,sPattern)
{
var m = sPattern.length;
var n = sText.length;
var i = m - 1;
while(i<=n-1)
{
var k = 0;
while ((k <= m) && (sPattern[m - 1 - k]) == sText[i - k])
{
k++;
}
if(k==m)
{
return (i - m + 1);
}
else
{
i += t[sText[i]];
}
}
return -1;
}
var shiftTable = function (sPat)
{
var i;
var j;
var m;
m = sPat.length;
for(i=0; i < MAX; i++)
{
t[i] = m;
}
for (j = 0; j<m-2; j++)
{
t[sPat[j]] = m-1 -j;
}
}
var program = function()
{
var text = 'lklkababcabab';
var pattern = 'ka';
shiftTable(pattern);
var pos = horsPool(text,pattern);
if(pos >= 0)
console.log('Pattern found in %d',pos);
else
console.log('Pattern not found');
}
var MAX = new Array(256);
var t = [MAX];
program();
非常感谢任何帮助。谢谢!
答案 0 :(得分:1)
让我们从下面开始:
var MAX = new Array(256);
var t = [MAX];
根本不起作用。第一行启动一个包含256个空条目的数组,第二行启动一个包含一个元素的数组:上面一行中的数组构建。我认为那不是你想做的。所以
var MAX = 256;
var t = new Array(MAX);
做你想做的事。
t[sPat[j]]
和t[sText[i]]
的行不会按预期工作,因为sText[i]
和sPat[j]
会返回一个字符而不是一个数字。您可以尝试t[sPat.charCodeAt(j)]
和t[sText.charCodeAt(i)]
。
为了给你一个没有太多帮助的开始,这里是维基百科给出的算法的直接实现:
var horsPool = function (haystack, needle)
{
var nl = needle.length;
var hl = haystack.length;
var skip = 0;
while (hl - skip >= nl)
{
var i = nl - 1;
while (haystack[skip + i] == needle[i])
{
if (i == 0) {
return skip;
}
i--;
}
skip = skip + t[haystack.charCodeAt(skip + nl - 1)];
}
return - 1;
}
var shiftTable = function (pattern)
{
for (var i = 0; i < MAX; i++) {
t[i] = pattern.length;
}
for (var i = 0; i < pattern.length - 1; i++) {
t[pattern.charCodeAt(i)] = pattern.length - 1 - i;
}
}
var program = function ()
{
var text = 'lklkababcabab';
var pattern = 'kab';
shiftTable(pattern);
var pos = horsPool(text, pattern);
if (pos >= 0)
console.log('Pattern found in %d', pos);
else
console.log('Pattern not found');
}
var MAX = 256;
var t = new Array(256);
program();