কম্পিউটার টিউটোরিয়াল

JavaScript-এ চেক করা: স্ট্রিং-১-এর অংশ রিঅ্যারেঞ্জ করলে স্ট্রিং-২ হয় কিনা

ভূমিকা

এই সমস্যাটি জানতে হয়: `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

কোড ব্যাখ্যা

  1. দুটি স্ট্রিংকে ক্যারেক্টার অ্যারেতে ভাগ করে (`split("")`)
  2. সর্ট করে (`sort()`)
  3. আবার স্ট্রিংয়ে জড়ায় (`join("")`)
  4. বড় স্ট্রিং-এ ছোট স্ট্রিং সাবস্ট্রিং হিসেবে আছে কিনা চেক করে (`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) টাইমে সমাধান করুন।

  1. ক্রোমে জাভাস্ক্রিপ্ট ফাংশন ডেফিনিশন কিভাবে খুঁজে বের করবেন?

  2. জাভাস্ক্রিপ্টে স্ট্রিংয়ের অংশটি পুনর্বিন্যাস করে অন্য স্ট্রিং তৈরি করা যায় কিনা যাচ্চ করা

  3. জাভাস্ক্রিপ্টে একটি স্ট্রিংকে কতবার দুহরালে অন্য স্ট্রিং সাবস্ট্রিং হয়?

  4. MySQL CHAR() ফাংশন ডিফল্টরূপে বাইনারি স্ট্রিং রিটার্ন করে তা কীভাবে চেক করবেন?