Z-Algoritması
Dizeler O(n) O(n)Her konum için, oradan başlayıp dizenin önekiyle eşleşen en uzun alt dizenin uzunluğunu hesaplar — bir [l, r) penceresini yeniden kullanarak.
i=0l=0r=0
1/24
Tanım gereği z[0] = n.
Değişmezz[i], i'de başlayıp metnin bir önekiyle eşleşen en uzun parçanın uzunluğudur.
z-algorithm.c
void zArray(const char *s, int n, int z[]) {z[0] = n;int l = 0, r = 0;for (int i = 1; i < n; i++) {if (i < r)z[i] = min(r - i, z[i - l]);while (i + z[i] < n &&s[z[i]] == s[i + z[i]])z[i]++;if (i + z[i] > r) {l = i;r = i + z[i];}}}
Z-Algoritması nasıl çalışır?
Z[i] = i'den başlayıp dizenin kendi önekiyle eşleşen en uzun alt dizenin uzunluğu. Korunan [l, r) eşleşme penceresi, her Z değerinin sıfırdan değil aynadaki eski değerden başlamasını sağlar.
Ne zaman kullanılır?
Desen eşleme (P#T ara), dize periyodikliği, önek tabanlı benzerlik.