Valid Anagram
Problem (yeniden ifade)
t, s’nin anagramıysa true döndür (aynı karakterler, aynı sıklıklar).
Sezgi
Anagramlar aynı karakter çoklu kümesini paylaşır. Frekans haritalarını veya sıralı biçimleri karşılaştır.
Yaklaşımlar
Karakter sayımları
DoğrulanmadıFikir. s’deki harfleri say, t ile azalt; hepsi sıfırsa anagram. Küçük İngilizce harf varsayar.
Yürüyüş. “anagram” / “nagaram” → sayımlar iptal → true.
Trade-off. Sıralama daha basit ama O(n log n). Unicode için hash map gerekir.
export function isAnagram(s: string, t: string): boolean {
if (s.length !== t.length) return false;
const cnt = new Array<number>(26).fill(0);
for (let i = 0; i < s.length; i++) {
cnt[s.charCodeAt(i)! - 97]!++;
cnt[t.charCodeAt(i)! - 97]!--;
}
return cnt.every((c) => c === 0);
}
export function isAnagram(s: string, t: string): boolean {
if (s.length !== t.length) return false;
const cnt = new Array<number>(26).fill(0);
for (let i = 0; i < s.length; i++) {
cnt[s.charCodeAt(i)! - 97]!++;
cnt[t.charCodeAt(i)! - 97]!--;
}
return cnt.every((c) => c === 0);
}
Şablon bağlantısı
Hashing şablonunun frekans imzası / sayım dizisi (group anagrams ile aynı anahtar fikri).
Yansıma
- Aynı çokluklar → sayım dizisi veya map. Sıralayıp kıyaslamak ne zaman yeter?
- Farklı uzunlukları erken kesmek hangi girdi ailesini O(1) yapar?
- Unicode / büyük harf yok; yalnızca
svetaynı uzunlukta mı kontrol ettin?