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

KMP / String Matching

Rehber 2 / 6 · Yol 2 / 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
b
a
b
a
b

Mutlu önek: soneke eşit, boş olmayan proper önek. s = ababab.

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 Happy Prefix

Problem (yeniden ifade)

Happy prefix, sonek de olan boş olmayan asıl önektir. En uzununu döndür; yoksa "".

Sezgi

Bu lps[n-1] tanımı. LPS kur, s[:lps[n-1]] al.

Yaklaşımlar

s'nin LPS'si

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

Fikir. Standart LPS. O uzunlukta öneki döndür.

Yürüyüş. level → l. ababab → abab. leetcode → "".

Trade-off. Doğrudan LPS. Rolling hash uzunluğu ikili arayabilir; daha fazla kod.

Çözüm
export function longestPrefix(s: string): string {
  const n = s.length;
  if (n === 0) return "";
  const lps = new Array<number>(n).fill(0);
  let length = 0;
  for (let i = 1; i < n; i++) {
    while (length > 0 && s[i] !== s[length]) length = lps[length - 1]!;
    if (s[i] === s[length]) length++;
    lps[i] = length;
  }
  return s.slice(0, lps[n - 1]!);
}
export function longestPrefix(s: string): string {
  const n = s.length;
  if (n === 0) return "";
  const lps = new Array<number>(n).fill(0);
  let length = 0;
  for (let i = 1; i < n; i++) {
    while (length > 0 && s[i] !== s[length]) length = lps[length - 1]!;
    if (s[i] === s[length]) length++;
    lps[i] = length;
  }
  return s.slice(0, lps[n - 1]!);
}

Şablon bağlantısı

Longest happy prefix = string’in LPS’si. LC 459 aynı son LPS değerini periyot olarak kullanır.

Yansıma