Group Anagrams
Problem (yeniden ifade)
Bir string dizisi verildiğinde anagramları grupla. Grup sırası ve grup içi sıra herhangi bir şey olabilir.
Sezgi
Anagramlar bir imza paylaşır: sıralı karakterler veya 26’lık sayım demeti. Hash map imza → kelime listesi.
Yaklaşımlar
Sıralı anahtarlı hash map
DoğrulanmadıFikir. Her kelime için key = sorted(word). Kelimeyi map[key]’e ekle.
Yürüyüş. [“eat”,“tea”,“tan”,“ate”] → “aet” anahtarı eat/tea/ate grubu; “ant” tan grubu.
Trade-off. Basit. Sayım dizisi anahtarı O(n·k) ve k büyükken daha hızlı.
export function groupAnagrams(strs: string[]): string[][] {
const map = new Map<string, string[]>();
for (const s of strs) {
const key = [...s].sort().join("");
const bucket = map.get(key) ?? [];
bucket.push(s);
map.set(key, bucket);
}
return [...map.values()];
}
export function groupAnagrams(strs: string[]): string[][] {
const map = new Map<string, string[]>();
for (const s of strs) {
const key = [...s].sort().join("");
const bucket = map.get(key) ?? [];
bucket.push(s);
map.set(key, bucket);
}
return [...map.values()];
}
Sayım imzalı hash map
DoğrulanmadıFikir. 26 harf sayımından string (veya tuple) olarak birleştirilmiş anahtar.
Yürüyüş. Aynı gruplama, toplam karakterde doğrusal.
Trade-off. Uzun string’lerde daha iyi asemptotik; biraz daha fazla kod.
export function groupAnagramsCount(strs: string[]): string[][] {
const map = new Map<string, string[]>();
for (const s of strs) {
const cnt = new Array(26).fill(0);
for (const ch of s) cnt[ch.charCodeAt(0) - 97]++;
const key = cnt.join("#");
const bucket = map.get(key) ?? [];
bucket.push(s);
map.set(key, bucket);
}
return [...map.values()];
}
export function groupAnagramsCount(strs: string[]): string[][] {
const map = new Map<string, string[]>();
for (const s of strs) {
const cnt = new Array(26).fill(0);
for (const ch of s) cnt[ch.charCodeAt(0) - 97]++;
const key = cnt.join("#");
const bucket = map.get(key) ?? [];
bucket.push(s);
map.set(key, bucket);
}
return [...map.values()];
}
Şablon bağlantısı
Hashing şablonundaki groupByKey. anahtar anagram imzası.
Yansıma
- Anagramları gruplamak için sıralı anahtar mı, 26’lık sayım mı? Hangisi
kuzunluğunda daha ucuz? - Boş string ve tek harfli girdiler ayrı gruplar mı, aynı grup mu?
- Anahtarı
joinetmezsen (listeyi map anahtarı yaparsan) hangi dilde kırılır?