Langsung ke konten
Hash map: hitung dan cari

Pelajaran 4.3

Mengecek anagram

7 menit · 8 langkah

  1. Langkah 1 dari 8 · Penjelasan

    Dua string adalah anagram kalau setiap huruf muncul sama banyak di keduanya. Urutannya bebas.

    Caranya: cek panjangnya dulu. Lalu hitung naik setiap huruf di a, dan hitung turun setiap huruf di b. Kalau ada huruf di b yang hitungannya sudah 0, berarti bukan anagram.

  2. Langkah 2 dari 8 · Tebak hasilnya

    Kode yang sama. Apa hasilnya untuk "aab" dan "abb"?

    function solution(a, b) {  if (a.length !== b.length) {    return false  }  const counts = new Map()  for (const ch of a) {    counts.set(ch, (counts.get(ch) || 0) + 1)  }  for (const ch of b) {    if (!counts.get(ch)) {      return false    }    counts.set(ch, counts.get(ch) - 1)  }  return true}
    1. false
    2. true
  3. Langkah 3 dari 8 · Tebak hasilnya

    Versi ini tidak mengecek panjang. Apa hasilnya untuk "abc" dan "ab"?

    function solution(a, b) {  const counts = new Map()  for (const ch of a) {    counts.set(ch, (counts.get(ch) || 0) + 1)  }  for (const ch of b) {    if (!counts.get(ch)) {      return false    }    counts.set(ch, counts.get(ch) - 1)  }  return true}
    1. true
    2. false
  4. Langkah 4 dari 8 · Pilih pendekatan

    Cek mana yang membuktikan dua string adalah anagram?

    1. Panjangnya sama dan setiap huruf punya hitungan yang sama
    2. Setiap huruf di a ada di b
    3. Panjangnya sama dan kumpulan hurufnya sama
    4. Huruf pertama dan terakhirnya sama
  5. Langkah 5 dari 8 · Susun kodenya

    Susun function yang me-return true kalau a dan b adalah anagram. Hitung naik dari a, hitung turun dari b, lalu pastikan semua hitungan kembali ke 0. Dua baris tidak termasuk.

    const counts = new Map()for (const c of counts.values()) {for (const ch of b) counts.set(ch, (counts.get(ch) || 0) + 1)if (a.length !== b.length) return false}if (c !== 0) return falsefor (const ch of b) counts.set(ch, (counts.get(ch) || 0) - 1)return true}function solution(a, b) {for (const ch of a) counts.set(ch, (counts.get(ch) || 0) + 1)if (c === 0) return false
  6. Langkah 6 dari 8 · Cari bug-nya

    Cek anagram ini memakai object biasa. Untuk "ab" dan "ba" kode ini me-return false, padahal harusnya true. Ketuk baris yang salah.

    function solution(a, b) {  if (a.length !== b.length) return false  const counts = {}  for (const ch of a) counts[ch]++  for (const ch of b) counts[ch]--  return Object.values(counts).every((c) => c === 0)}
  7. Langkah 7 dari 8 · Tulis kodenya

    solution(note, letters)

    Return true kalau note bisa disusun dari huruf-huruf di letters. Setiap huruf di letters hanya boleh dipakai sekali.
    Constraint: 0 ≤ note.length, letters.length ≤ 10⁵, huruf kecil saja.

    function solution(note, letters) {  // "aab", "baa" -> true  // "aa", "ab" -> false }
  8. Langkah 8 dari 8 · Ringkasan

    • Anagram berarti setiap huruf punya hitungan yang sama, bukan hanya huruf yang sama.
    • Cek panjang dulu. Tanpa itu, huruf sisa di string yang lebih panjang lolos.
    • Hitung naik dari satu string, hitung turun dari yang lain.

    Kartu pola

    Hitung naik, hitung turun
    Kapan dipakai: Saat dua kumpulan harus punya isi yang sama, dalam urutan apa saja. Anagram, susun dari huruf, atau perbandingan inventaris.
    if (a.length !== b.length) return falsefor (const ch of a) counts.set(ch, (counts.get(ch) || 0) + 1)for (const ch of b) {  if (!counts.get(ch)) return false  counts.set(ch, counts.get(ch) - 1)}return true