Как начальная длина палиндрома при индексе i равна R - i в «алгоритме Манахера»? - PullRequest
0 голосов
/ 31 марта 2019

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

Вместо того, чтобы расширяться от нуля, мы поддерживаем массив P, чтобы отслеживать длину центра палиндромов в i по мере продвижения.Мой вопрос: откуда мы знаем, что будет палиндром размера Ri, если палиндром у зеркала меньше?

Это код для него.

    def longestPalindrome(self, s):
        # Transform S into T.
        # For example, S = "abba", T = "^#a#b#b#a#$".
        # ^ and $ signs are sentinels appended to each end to avoid bounds checking
        T = '#'.join('^{}$'.format(s))
        n = len(T)
        P = [0] * n
        C = R = 0
        for i in range (1, n-1):

            if (R > i):
               # WHY R-i, how do we know there will be palindrome of size R -i
                P[i] =  min(R - i, P[2*C - i]) 

            # Attempt to expand palindrome centered at i
            while T[i + 1 + P[i]] == T[i - 1 - P[i]]:
                P[i] += 1

            # If palindrome centered at i expand past R,
            # adjust center based on expanded palindrome.
            if i + P[i] > R:
                C, R = i, i + P[i]

        # Find the maximum element in P.
        maxLen, centerIndex = max((n, i) for i, n in enumerate(P))    
        return s[(centerIndex  - maxLen)//2: (centerIndex  + maxLen)//2]

все примеры того, что янайдены как

a # b # a # b # b # a # b # a
   i'          C         i    

Я понимаю, что в этом случае есть подпалиндромы в i, но как насчет случаев, подобных

a # b # c # d # d # c # b # a
   i'          C         i    

Откуда мы знаем, что P [i] будет либо Riили палиндром у зеркала?

1 Ответ

0 голосов
/ 31 марта 2019

Эта страница объясняет алгоритм манахера и отвечает на вопрос визуальной анимацией.

Визуальное объяснение алгоритма Манахера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...