İçeriğe atla
ΣDSA Patterns
Menü
Dil

Trie

Rehber 1 / 6 · Yol 1 / 6

Etkileşimli

Zihinsel model

Bu problem için animasyonlu çözüm. Adımları kaydır veya boşlukla duraklat; değişmezi yüksek sesle yeniden anlat.

Adım 1 / 7
.

children map · isWord flag

Boş trie. apple ekle, sonra apple / app ara ve startsWith app.

Demo önizleme: Bu çözümler otomatik test paketini geçiyor ama insan tarafından incelenmedi. Trade-off ve yazıları taslak olarak değerlendirin.

Mediumtrie

Implement Trie (Prefix Tree)

Problem (yeniden ifade)

insert, search (tam kelime) ve startsWith (önek) ile Trie uygula.

Sezgi

Her düğümde children map/dizi; kelime-sonu bayrağı.

Yaklaşımlar

Trie insert/search/startsWith

Doğrulanmadı
Zaman O(L) per opAlan O(Σ L)

Fikir. her karakter için kenarları yürü; insert’te oluştur; search end bayrağı ister.

Yürüyüş. insert apple; search apple true; search app false; startsWith app true.

Trade-off. Array[26] küçük harf için en hızlı; map genelleştirir.

Çözüm
class TrieNode {
  children: Map<string, TrieNode> = new Map();
  end = false;
}

export class Trie {
  private root = new TrieNode();
  insert(word: string): void {
    let n = this.root;
    for (const c of word) {
      if (!n.children.has(c)) n.children.set(c, new TrieNode());
      n = n.children.get(c)!;
    }
    n.end = true;
  }
  search(word: string): boolean {
    const n = this.walk(word);
    return !!n && n.end;
  }
  startsWith(prefix: string): boolean {
    return !!this.walk(prefix);
  }
  private walk(s: string): TrieNode | null {
    let n = this.root;
    for (const c of s) {
      if (!n.children.has(c)) return null;
      n = n.children.get(c)!;
    }
    return n;
  }
}
class TrieNode {
  children: Map<string, TrieNode> = new Map();
  end = false;
}

export class Trie {
  private root = new TrieNode();
  insert(word: string): void {
    let n = this.root;
    for (const c of word) {
      if (!n.children.has(c)) n.children.set(c, new TrieNode());
      n = n.children.get(c)!;
    }
    n.end = true;
  }
  search(word: string): boolean {
    const n = this.walk(word);
    return !!n && n.end;
  }
  startsWith(prefix: string): boolean {
    return !!this.walk(prefix);
  }
  private walk(s: string): TrieNode | null {
    let n = this.root;
    for (const c of s) {
      if (!n.children.has(c)) return null;
      n = n.children.get(c)!;
    }
    return n;
  }
}

Şablon bağlantısı

Trie şablon iskeleti.

Yansıma