Skip to main content

kmp_search

Function kmp_search 

Source
pub fn kmp_search(text: &str, pattern: &str) -> Vec<usize>
Expand description

KMP (Knuth–Morris–Pratt) — matndan namunani O(n + m) da qidirish.

Muammo: sodda qidiruvda moslik buzilganda biz boshiga qaytamiz va allaqachon o’qigan belgilarni qayta o’qiymiz.

KMP yechimi: namunaning o’zidan prefiks funksiyasi (LPS jadvali) tuzamiz: lps[i] = pattern[..=i] ning ham prefiks, ham suffiks bo’la oladigan eng uzun qismining uzunligi. Moslik buzilganda shu jadval bizga “qayerdan davom etish“ni aytadi — matn bo’yicha hech qachon orqaga qaytmaymiz.

 pattern: a b a b a c a
 lps:     0 0 1 2 3 0 1
                   ↑ "aba" ham bosh, ham oxir
  • Time: O(n + m), Space: O(m).

Qaytadi: namunaning barcha boshlanish indekslari (belgilar bo’yicha).

§Misol

use rust_algorithms::other::strings::kmp_search;

assert_eq!(kmp_search("ABABDABACDABABCABAB", "ABABCABAB"), vec![10]);
assert_eq!(kmp_search("aaaaa", "aa"), vec![0, 1, 2, 3]);
assert_eq!(kmp_search("abc", "xyz"), Vec::<usize>::new());