Chúng tôi được yêu cầu viết một hàm JavaScript có thể so sánh hai chuỗi và trả về tỷ lệ phần trăm khả năng chúng giống nhau bao nhiêu. Tỷ lệ phần trăm sẽ không là gì ngoài số đo của nhiều ký tự mà hai chuỗi có điểm chung.
Nếu chúng hoàn toàn giống nhau, kết quả đầu ra phải là 100 và nếu chúng không chứa ký tự chung nào, thì kết quả đầu ra phải là 0.
Ví dụ
const calculateSimilarity = (str1 = '', str2 = '') => { let longer = str1; let shorter = str2; if (str1.length < str2.length) { longer = str2; shorter = str1; } let longerLength = longer.length; if (longerLength == 0) { return 1.0; } return +((longerLength - matchDestructively(longer, shorter)) / parseFloat(longerLength) * 100).toFixed(2); }; const matchDestructively = (str1 = '', str2 = '') => { str1 = str1.toLowerCase(); str2 = str2.toLowerCase(); let arr = new Array(); for (let i = 0; i <= str1.length; i++) { let lastValue = i; for (let j = 0; j <= str2.length; j++) { if (i == 0){ arr[j] = j; }else if(j > 0){ let newValue = arr[j - 1]; if(str1.charAt(i - 1) != str2.charAt(j - 1)) newValue = Math.min(Math.min(newValue, lastValue), arr[j]) + 1; arr[j - 1] = lastValue; lastValue = newValue; } } if (i > 0) arr[str2.length] = lastValue; } return arr[str2.length]; }; console.log(calculateSimilarity('Mathematics','Mathamatecs'));
Đầu ra
Điều này sẽ tạo ra kết quả sau -
[ [ 1, 10, 100 ], [ 1, 10, 200 ], [ 1, 10, 300 ], [ 1, 20, 100 ], [ 1, 20, 200 ], [ 1, 20, 300 ], [ 2, 10, 100 ], [ 2, 10, 200 ], [ 2, 10, 300 ], [ 2, 20, 100 ], [ 2, 20, 200 ], [ 2, 20, 300 ] ]