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

Kayar Pencere

Rehber 4 / 6 · Yol 4 / 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 / 6
A
A
B
A
B
B
A

k = 1

En fazla k=1 harf değiştir. window − maxFreq ≤ 1 olan en uzun pencereyi ara.

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

Longest Repeating Character Replacement

Problem (yeniden ifade)

s dizgisinde en fazla k karakteri değiştirebilirsin. Tamamen aynı karaktere dönüştürülebilecek en uzun alt dizginin uzunluğunu döndür.

Sezgi

Bir pencerede gereken değişiklik = pencere uzunluğu − en sık karakterin sayısı. Bunu ≤ k tut.

Yaklaşımlar

Kayar pencere + maksimum frekans

Doğrulanmadı
Zaman O(n)Alan O(1)

Fikir. Sağı genişlet, penceredeki karakter sayılarını ve maxFreq’i izle. (right-left+1, maxFreq) > k iken solu daralt.

Yürüyüş. s=“AABABBA”, k=1. Pencere “AABA” tutabilir (1 değişiklik) uzunluk 4; “ABABB” daralır; en iyi 4 kalır.

Trade-off. Cevabın doğruluğu için daralırken maxFreq’in azalması gerekmez (pencere tarihsel max’ın altına inmek zorunda değildir).

Çözüm
export function characterReplacement(s: string, k: number): number {
  const cnt = new Array<number>(26).fill(0);
  let left = 0, maxFreq = 0, best = 0;
  for (let right = 0; right < s.length; right++) {
    const i = s.charCodeAt(right)! - 65;
    cnt[i]!++;
    maxFreq = Math.max(maxFreq, cnt[i]!);
    while (right - left + 1 - maxFreq > k) {
      cnt[s.charCodeAt(left)! - 65]!--;
      left++;
    }
    best = Math.max(best, right - left + 1);
  }
  return best;
}
export function characterReplacement(s: string, k: number): number {
  const cnt = new Array<number>(26).fill(0);
  let left = 0, maxFreq = 0, best = 0;
  for (let right = 0; right < s.length; right++) {
    const i = s.charCodeAt(right)! - 65;
    cnt[i]!++;
    maxFreq = Math.max(maxFreq, cnt[i]!);
    while (right - left + 1 - maxFreq > k) {
      cnt[s.charCodeAt(left)! - 65]!--;
      left++;
    }
    best = Math.max(best, right - left + 1);
  }
  return best;
}

Şablon bağlantısı

Max-frekans sayaçlı sliding window: window − maxFreq > k iken küçült.

Yansıma