86 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			86 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | /* 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; | ||
|  | }; |