ভূমিকা
এই সমস্যাটি জানতে হয়: `str1`-এর ক্যারেক্টারগুলো রিঅ্যারেঞ্জ (পুনর্বিন্যাস) করে `str2` বানানো সম্ভব কিনা। অর্থাৎ, `str2`-এর সব ক্যারেক্টার `str1`-এ আছে কিনা (ফ্রিকোয়েন্সি মিলায়) যাচাই করতে হবে।
সম্পূর্ণ কোড
const str1 = 'cashwool';
const str2 = 'school';
const scramble = (str1, str2) => {
const { length: len1 } = str1;
const { length: len2 } = str2;
const firstSortedString = str1.split("").sort().join("");
const secondSortedString = str2.split("").sort().join("");
if (len1 > len2) {
return firstSortedString.includes(secondSortedString);
}
return secondSortedString.includes(firstSortedString);
};
console.log(scramble(str1, str2)); // true
কোড ব্যাখ্যা
- দুটি স্ট্রিংকে ক্যারেক্টার অ্যারেতে ভাগ করে (`split("")`)
- সর্ট করে (`sort()`)
- আবার স্ট্রিংয়ে জড়ায় (`join("")`)
- বড় স্ট্রিং-এ ছোট স্ট্রিং সাবস্ট্রিং হিসেবে আছে কিনা চেক করে (`includes()`)
⚠️ এই পদ্ধতির সীমাবদ্ধতা
**সাবস্ট্রিং চেক (`includes`) সঠিক নয়** ফ্রিকোয়েন্সি মিলানোর জন্য। উদাহরণ:
str1 = "aab"; // sorted: "aab"
str2 = "ab"; // sorted: "ab"
"aab".includes("ab") // true ✓
str1 = "abb"; // sorted: "abb"
str2 = "ab"; // sorted: "ab"
"abb".includes("ab") // true ✓
str1 = "abc"; // sorted: "abc"
str2 = "aabb"; // sorted: "aabb"
"abc".includes("aabb") // false ✓ (কাজ করে)
// কিন্তু:
str1 = "aabc"; // sorted: "aabc"
str2 = "abb"; // sorted: "abb"
"aabc".includes("abb") // false ✓
// সমস্যা:
str1 = "aaab"; // sorted: "aaab"
str2 = "ab"; // sorted: "ab"
"aaab".includes("ab") // true ✓ (কাজ করে)
// কিন্তু যদি str2 = "aab" হয়:
"aaab".includes("aab") // true ✓
// আসলে str1-এ ৩টি 'a' আছে, str2-তে ২টি 'a' লাগে -_VALID_
সঠিক পদ্ধতি: ফ্রিকোয়েন্সি কাউন্ট (Frequency Count)
const scrambleCorrect = (str1, str2) => {
if (str2.length > str1.length) return false;
const freq = {};
// str1-এর ক্যারেক্টার ফ্রিকোয়েন্সি গণনা
for (const char of str1) {
freq[char] = (freq[char] || 0) + 1;
}
// str2-এর ক্যারেক্টার চেক করুন
for (const char of str2) {
if (!freq[char] || freq[char] === 0) {
return false; // পর্যাপ্ত ক্যারেক্টার নেই
}
freq[char]--;
}
return true;
};
// টেস্ট
console.log(scrambleCorrect('cashwool', 'school')); // true
console.log(scrambleCorrect('katas', 'steak')); // false
console.log(scrambleCorrect('aab', 'ab')); // true
console.log(scrambleCorrect('abc', 'aabb')); // false
আউটপুট
true
পারফরম্যান্স তুলনা
| পদ্ধতি | টাইম | স্পেস | সঠিকতা |
|---|---|---|---|
| সর্ট + includes | O(n log n) | O(n) | ❌ ভুল (এজ কেসে) |
| ফ্রিকোয়েন্সি ম্যাপ | O(n + m) | O(k) | ✅ সঠিক |
ES6+ Map ব্যবহার (বেটার)
const scrambleModern = (str1, str2) => {
if (str2.length > str1.length) return false;
const freq = new Map();
for (const char of str1) {
freq.set(char, (freq.get(char) || 0) + 1);
}
for (const char of str2) {
const count = freq.get(char) || 0;
if (count === 0) return false;
freq.set(char, count - 1);
}
return true;
};
সারাংশ
স্ট্রিং রিঅ্যারেঞ্জ চেকের জন্য **ফ্রিকোয়েন্সি কাউন্ট** একমাত্র সঠিক পদ্ধতি। সর্ট + `includes` পদ্ধতিতে লজিক্যাল ফ্লা আছে। Map অবজেক্ট ব্যবহার করে O(n) টাইমে সমাধান করুন।