Вычисление следующего префиксного индекса в реализациях KMP

Я прочитал несколько различных реализаций KMP и не могу понять один аспект, который они все разделяют.

Когда они вычисляют самый длинный префикс, который также является суффикс-массивом (lps). Если символы не совпадают в индексах, протестированных на определенной итерации, и индекс префикса не равен 0. Индекс префикса устанавливается равным

index = lps[index - 1];

Вот пример

void computeLPSArray(String pat, int M, int lps[])
{
    // length of the previous longest prefix suffix
    int len = 0;
    int i = 1;
    lps[0] = 0;  // lps[0] is always 0

    // the loop calculates lps[i] for i = 1 to M-1
    while (i < M)
    {
        if (pat.charAt(i) == pat.charAt(len))
        {
            len++;
            lps[i] = len;
            i++;
        }
        else  // (pat[i] != pat[len])
        {
            // This is tricky. Consider the example.
            // AAACAAAA and i = 7. The idea is similar 
            // to search step.
            if (len != 0)
            {
                len = lps[len-1];

                // Also, note that we do not increment
                // i here
            }
            else  // if (len == 0)
            {
                lps[i] = len;
                i++;
            }
        }
    }
}

Есть ли ситуация, когда index = lps [index-1] не эквивалентен

индекс--;

0 ответов

Другие вопросы по тегам