我试图通过Levenshtein算法了解动态编程,但我一直坚持这几个小时。我知道我在以下问题上的尝试是'蛮力'之一。我将如何使用“动态编程”来改变我的方法?我几乎失去了....如何通过Levenshtein算法(使用Javascript)使用动态编程
问题:给定两个字符串s和t,其中n和m的长度,创建一个 函数,返回下列字符串之一:“插入C”如果 字符串t可以通过插入字符C“删除C” (与上述相同的逻辑)“交换cd”来获得,如果字符串t可以通过交换出现在 中的两个相邻字符(c和d)从 获得字符串s在原始字符串中的顺序。 “没什么”,如果没有操作需要“不可能” 如果没有上述作品即Levenshtein距离大于1
这里是我的蛮力尝试。 “tuple”变量的名称是错误的,因为我最初想将索引和值推送到矩阵中,但却被卡住了。
function levenshtein(str1, str2) {
var m = str1.length,
n = str2.length,
d = [],
i, j,
vals = [],
vals2 = [];
for (i = 0; i <= m ; i++) {
var tuple = [str1[i]];
//console.log(tuple);
// console.log(tuple);
d[i] = [i];
// console.log(str1[i]);
vals.push(tuple);
}
vals = [].concat.apply([], vals);
vals = vals.filter(function(n){ return n; });
console.log(vals);
for (j = 0; j <= n; j++) {
d[0][j] = j;
var tuple2 = [str2[j]];
// console.log(tuple2);
vals2.push(tuple2);
// console.log(vals2);
}
vals2 = [].concat.apply([], vals2);
vals2 = vals2.filter(function(n){ return n ;});
console.log(vals2);
for (j = 1; j <= n; j++) {
for (i = 1; i <= m; i++) {
if (str1[i - 1] == str2[j - 1]) d[i][j] = d[i - 1][j - 1];
else d[i][j] = Math.min(d[i - 1][j], d[i][j - 1], d[i - 1][j - 1]) + 1;
}
}
var val = d[m][n];
// console.log(d);
if(val > 1){
return "IMPOSSIBLE";
}
if(val === 0){
return "NOTHING";
}
//console.log(d);
if(val === 1){
//find the missing element between the vals
//return "INSERT " + missing element
//find the extra element
//return "DELETE + " extra element
//find the out of place element and swap with another
}
}
console.log(levenshtein("kitten", "mitten"));
// console.log(levenshtein("stop", "tops"));
// console.log(levenshtein("blahblah", "blahblah"));
哇,太神奇了谢谢。所以我并不需要所有这些矩阵...... – devdropper87