Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 字符串比较算法中的一个错误 描述_Javascript_Math - Fatal编程技术网

Javascript 字符串比较算法中的一个错误 描述

Javascript 字符串比较算法中的一个错误 描述,javascript,math,Javascript,Math,我正在尝试使用Wikipedia中描述的矩阵方法实现Levenshtein距离函数的JS版本 问题 该算法按预期工作,它返回字符串之间的差异(为使字符串相等,需要进行的编辑量),但它忽略索引0,无论索引0处的字符是什么,它始终认为它是“正确的”: levenshteinDistance('cat','cave')//2(正确) levenshteinDistance('cat','cap')//1(正确) levenshteInstance('cat','hat')//0(应为1) levens

我正在尝试使用Wikipedia中描述的矩阵方法实现Levenshtein距离函数的JS版本

问题 该算法按预期工作,它返回字符串之间的差异(为使字符串相等,需要进行的编辑量),但它忽略索引0,无论索引0处的字符是什么,它始终认为它是“正确的”:

levenshteinDistance('cat','cave')//2(正确)
levenshteinDistance('cat','cap')//1(正确)
levenshteInstance('cat','hat')//0(应为1)
levenshteInstance('cat','rat')//0(应为1)
levenshteindication('cat','bat')//0(应为1)
代码

函数levenshteinDistance(string1、string2、选项){
如果(string1==string2){返回0}
设矩阵=[]
出租成本
让我
让j
//Init每行的第一列

对于(i=0;i我认为你犯了一个小错误我认为:

cost = string1[i] === string2[j]
应该是:

cost = string1[i-1] === string2[j-1]
否则,您永远不会检查字符串中第一个字母的成本,并且在替换的情况下,后面的字母的成本总是从中派生出来

编辑: 转置部分/允许键入部分内的部分也应更改为:

string1[i] === string2[j - 1] && 
string1[i - 1] === string2[j]


在阅读了维基百科的文章后,出于某种原因,他们使用1个索引数组作为字符串,0个索引数组作为矩阵,所以我想这是问题的根源。

谢谢你的回答。wiki页面上的算法也比较了
string1[I]==string2[j]
但是,您的解决方案修复了索引0的问题,除了现在的
换位检查停止工作(它应该修复1个字符的键入字符串移位),如果我比较
hat,hta
现在返回
2
而不是
1
@Alex,我想你也需要调整转置内部的比较索引。因为在某一点上,你的检查字符串[3]返回未定义。我将其更改为
string1[I-1]==string2[j-2]和&string1[I-2]==string2[j-1]
如果您发现其他问题,请告诉我。否则,我将编辑我的答案并添加它。非常感谢您花费时间发现问题,您的解决方案解决了问题!当您构建一个大型应用程序时,类似这样的小问题会很快出现。我正在构建一个现代、免费和开源的文件管理器应用程序(对于Windows、Mac、Linux),它的一个功能是非常快速、智能的文件搜索,允许您在几秒钟内找到计算机上的任何文件/目录,无论它位于何处,即使您拼错了所有搜索词。因此,经过几天的工作,我终于在您的帮助下完成了此功能,谢谢!
string1[i-1] === string2[j - 2] &&
string1[i - 2] === string2[j-1]