Group Anagrams: bir string listesindeki anagramları gruplayın.
Cevap
Anagramlar aynı harfleri aynı sayıda içerir. Her kelime için kanonik bir anahtar üretip hash map'te gruplarız. İki anahtar seçeneği vardır: sıralanmış harfler veya 26 elemanlı harf sayacı.
from collections import defaultdict
def group_anagrams(words):
groups = defaultdict(list)
for w in words:
groups["".join(sorted(w))].append(w)
return list(groups.values())
print(group_anagrams(["eat", "tea", "tan", "ate", "nat", "bat"]))
# [['eat', 'tea', 'ate'], ['tan', 'nat'], ['bat']]Sayaç anahtarı (daha hızlı)
def group_anagrams_count(words):
groups = defaultdict(list)
for w in words:
count = [0] * 26
for ch in w:
count[ord(ch) - ord("a")] += 1
groups[tuple(count)].append(w) # liste hash'lenemez, tuple kullan
return list(groups.values())Karmaşıklık (n kelime, en uzun kelime k harf)
| Anahtar | Zaman | Bellek |
|---|---|---|
| Sıralı string | O(n x k log k) | O(n x k) |
| Harf sayacı | O(n x k) | O(n x k) |
Tartışılacak noktalar
- Girdi yalnızca küçük İngilizce harf mi? Unicode veya büyük/küçük harf karışıksa sayaç yerine
Counterveya sıralama tercih edilir. - Python'da listeler değiştirilebilir (mutable) olduğu için dict anahtarı olamaz;
tuple'a çevirmek gerekir. Bu, hash'lenebilirlik konusunu bildiğinizi gösterir.
İlgili soru: Valid Anagram (iki kelime anagram mı?) bunun basit hâlidir.
İlgili Algoritmalar & Veri Yapıları soruları
- Binary search'ün zaman karmaşıklığı nedir ve neden?
- Two Sum: toplamı hedefe eşit olan iki elemanın indekslerini bulun.
- Bir parantez dizisinin geçerli olup olmadığını kontrol edin: "({[]})"
- Tek yönlü bağlı listeyi ters çevirin.
- BFS ve DFS arasındaki fark nedir? Hangisini ne zaman kullanırsınız?
- get ve put işlemleri O(1) olan bir LRU Cache tasarlayın.
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.