সমস্যা বিবরণ
দুটি স্ট্রিং তুলনা করে কতটুকু মিল আছে তা পার্সেন্টেজে রিটার্ন করতে হবে। ১০০ = পুরোপুরি মিল, ০ = কোনো মিল নেই। লেভেনস্টাইন ডিস্ট্যান্স বা সিমিলারিটি মেট্রিক ব্যবহার করা হয়।
সমাধান
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'));
আউটপুট
উদাহরণ আউটপুট ভিন্ন হতে পারে (লেভেনস্টাইন ডিস্ট্যান্স বেইসড)।
ব্যাখ্যা
matchDestructivelyলেভেনস্টাইন এডিট ডিস্ট্যান্স ক্যালকুলেট করে (ইনসার্ট, ডিলিট, রিপ্লেস)।- সিমিলারিটি =
(longerLength - distance) / longerLength * 100।