heyujie
2021-06-07 8f8155aa4c83f7c2577ac123add550766b6a7ce3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/* eslint-disable no-nested-ternary */
'use strict';
var arr = [];
var charCodeCache = [];
 
module.exports = function (a, b) {
    if (a === b) {
        return 0;
    }
 
    var swap = a;
 
    // Swapping the strings if `a` is longer than `b` so we know which one is the
    // shortest & which one is the longest
    if (a.length > b.length) {
        a = b;
        b = swap;
    }
 
    var aLen = a.length;
    var bLen = b.length;
 
    if (aLen === 0) {
        return bLen;
    }
 
    if (bLen === 0) {
        return aLen;
    }
 
    // Performing suffix trimming:
    // We can linearly drop suffix common to both strings since they
    // don't increase distance at all
    // Note: `~-` is the bitwise way to perform a `- 1` operation
    while (aLen > 0 && (a.charCodeAt(~-aLen) === b.charCodeAt(~-bLen))) {
        aLen--;
        bLen--;
    }
 
    if (aLen === 0) {
        return bLen;
    }
 
    // Performing prefix trimming
    // We can linearly drop prefix common to both strings since they
    // don't increase distance at all
    var start = 0;
 
    while (start < aLen && (a.charCodeAt(start) === b.charCodeAt(start))) {
        start++;
    }
 
    aLen -= start;
    bLen -= start;
 
    if (aLen === 0) {
        return bLen;
    }
 
    var bCharCode;
    var ret;
    var tmp;
    var tmp2;
    var i = 0;
    var j = 0;
 
    while (i < aLen) {
        charCodeCache[start + i] = a.charCodeAt(start + i);
        arr[i] = ++i;
    }
 
    while (j < bLen) {
        bCharCode = b.charCodeAt(start + j);
        tmp = j++;
        ret = j;
 
        for (i = 0; i < aLen; i++) {
            tmp2 = bCharCode === charCodeCache[start + i] ? tmp : tmp + 1;
            tmp = arr[i];
            ret = arr[i] = tmp > ret ? tmp2 > ret ? ret + 1 : tmp2 : tmp2 > tmp ? tmp + 1 : tmp2;
        }
    }
 
    return ret;
};