Emir777

Levenshtein

Dec 17th, 2019
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function resCmp(a, b) {
  2.     if (a.type == "D" && b.type == "I") return -1;
  3.     if (a.type == "I" && b.type == "D") return 1;
  4.     if (a.type == b.type && a.type == "I") return a.pos - b.pos;
  5.     return b.pos - a.pos;
  6. }
  7.  
  8. function editList(left, right) {
  9.     var inf = 1e9;
  10.     var dp = [];
  11.     var p = [];
  12.     for (var i = 0; i <= left.length; i++) {
  13.         dp.push([]);
  14.         p.push([]);
  15.         for (var j = 0; j <= right.length; j++) {
  16.             dp[i].push(inf);
  17.             p[i].push([0, 0, { type: "", pos: 0, symbol: "" }]);
  18.         }
  19.     }
  20.     dp[0][0] = 0;
  21.     p[0][0] = [-1, -1, { type: "", pos: 0, symbol: "" }];
  22.     for (var i = 1; i <= left.length; i++) {
  23.         dp[i][0] = dp[i - 1][0] + 1;
  24.         p[i][0] = [i - 1, 0, { type: "D", pos: i - 1, symbol: left[i - 1] }];
  25.     }
  26.     for (var i = 1; i <= right.length; i++) {
  27.         dp[0][i] = dp[0][i - 1] + 1;
  28.         p[0][i] = [0, i - 1, { type: "I", pos: i - 1, symbol: right[i - 1] }];
  29.     }
  30.     for (var i = 1; i <= left.length; i++) {
  31.         for (var j = 1; j <= right.length; j++) {
  32.             if (dp[i][j] > dp[i - 1][j] + 1) {
  33.                 dp[i][j] = dp[i - 1][j] + 1;
  34.                 p[i][j] = [i - 1, j, { type: "D", pos: i - 1, symbol: left[i - 1] }];
  35.             }
  36.             if (dp[i][j] > dp[i][j - 1] + 1) {
  37.                 dp[i][j] = dp[i][j - 1] + 1;
  38.                 p[i][j] = [i, j - 1, { type: "I", pos: j - 1, symbol: right[j - 1] }];
  39.             }
  40.             if (left[i - 1] == right[j - 1]) {
  41.                 if (dp[i][j] > dp[i - 1][j - 1]) {
  42.                     dp[i][j] = dp[i - 1][j - 1];
  43.                     p[i][j] = [i - 1, j - 1, { type: "A", pos: i - 1, symbol: right[j - 1] }];
  44.                 }
  45.             }
  46.         }
  47.     }
  48.     var res = [];
  49.     var x = left.length;
  50.     var y = right.length;
  51.     while (x != 0 || y != 0) {
  52.         if (p[x][y][2].type != "A") {
  53.             res.push(p[x][y][2]);
  54.         }
  55.         var buf = x;
  56.         x = p[x][y][0];
  57.         y = p[buf][y][1];
  58.     }
  59.     res.reverse();
  60.     res.sort(resCmp);
  61.     return res;
  62. }
Advertisement
Add Comment
Please, Sign In to add comment