天真的字符串匹配算法出错

时间:2018-08-25 12:38:21

标签: javascript algorithm naivebayes

我正在尝试实施幼稚搜索,但没有得到预期的结果。有人可以在这里指出,可能是什么错误。

function naive(string, str) {
    for (let i = 0; i <= string.length - str.length; i++) {
        if (string[i] == str[0]) {
            let counter = 1

            for (let j = 1; j <= str.length; j++) {
                if (string[i + j] == str[j]) {
                    counter++;
                    console.log(counter)
                } else
                    counter = 0;
            }

            if (counter == str.length) {
                console.log(`${counter} pattern matched at ${i}`)
            }
        } else
            console.log('nothing matched')
    }
}

2 个答案:

答案 0 :(得分:2)

var match_found = false;
function naive(string, str){
  for(let i =0; i <= string.length - str.length; i++){
      if(string[i] == str[0]){
        let counter= 1
            for(let j = 1; j < str.length; j++){
                if(string[i + j] == str[j]){    
                  counter++;
                }else{
                  break;
                }
            }
        if(counter == str.length){ 
          console.log('Pattern matched at ' + i);
          match_found = true;// can break; here if you wish to, else it will give you all matches present
        }
      }
  }
  if(match_found === false){
    console.log(str + ' not found in ' + string);
  }
}

naive('abcdgggabcdggg','ggg');

  • 在存在匹配项的情况下,您increment counter,但是您需要break进行mismatch循环。

  • 您的内部for循环条件需要使用j < str.length而不是j <= str.length,因为索引从0开始。

  • else console.log('nothing matched')。您无法just instantly做出决定。如果字符串索引不匹配,则仍需要继续寻找其余的索引。 最好的解决方法是为其维护一个布尔标志,如上面的代码所示。

答案 1 :(得分:1)

您不需要自己进行所有迭代和比较。这是您的函数的简单版本:

function naive(string, str) {
  var counter = 0, 
    i = string.indexOf(str, 0);  //find first occurance of str in string

  while(i !== -1){
    ++counter;  //we have a match, count one up
    console.log(`counter %i, index %i`, counter, i);
    i = string.indexOf(str, i+1);  //find next occurance 
  }
  return counter;
}

console.log("result", naive("lorem upsum", "m"));