天真的字符串匹配算法出了问题
naive string matching algorithm gone wrong
我正在尝试实施简单搜索,但没有得到预期的结果。任何人都可以在这里指出,可能是什么错误。
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')
}
}
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
.
[=36= 开始]
else console.log('nothing matched')
。你不能 just instantly
决定那个。如果一个字符串索引不匹配,您仍然需要继续寻找其余的索引。
最好的方法是为它维护一个布尔标志,如上面的代码所示。
您不需要自己进行所有迭代和比较。这是您的函数的更简单版本:
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"));
我正在尝试实施简单搜索,但没有得到预期的结果。任何人都可以在这里指出,可能是什么错误。
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')
}
}
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 循环条件需要
[=36= 开始]j < str.length
而不是j <= str.length
,因为索引从0
.else console.log('nothing matched')
。你不能just instantly
决定那个。如果一个字符串索引不匹配,您仍然需要继续寻找其余的索引。 最好的方法是为它维护一个布尔标志,如上面的代码所示。
您不需要自己进行所有迭代和比较。这是您的函数的更简单版本:
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"));