Se a sobreposição for permitida, isso poderá ser feito em tempo linear (no tamanho da sequência de entrada).
Algumas definições
Vamos definir o conceito de palíndromo máximo :
Um palíndromo máximo de raio k de uma corda S é uma substring S 'tal que
- começando do centro, S 'lê os mesmos k caracteres em ambas as direções
- mas não para k + 1 caracteres
- k> 1 (portanto, um único caractere não é um palíndromo)
por exemplo, se S = banana
, então, S' = anana
é um palíndromo máximo de raio 2.
Um palíndromo máximo é um palíndromo máximo de raio k para alguns k.
Por exemplo, se S = banana
, "ana"
, "anana"
, estão todas as suas palindromes máximas.
Usando palíndromos máximos
Agora, se pudéssemos localizar todos os palíndromos máximos de uma string , seria simples verificar se a string inteira é uma concatenação de palindromes.
Tome S = abbaccazayaz
. Seus palíndromos máximos são:
- abba, centrado entre as posições 2 e 3, raio = 2
- acca, centralizado entre as posições 5 e 6, raio = 2
- zayaz, centrado na posição 10, raio = 2
então "abba" se estende por [1..4], "acca" se estende por [4..7], "zayaz" se estende por [8..12]. Como a concatenação desses três palíndromos (a sobreposição é permitida?) Se estende por toda a cadeia, segue-se que "abbaccazayaz" é concatenação de palíndromos.
Computando palíndromos máximos em tempo linear
Agora, verifica-se que podemos localizar todos os palíndromos máximos de uma sequência S em tempo linear !*
A idéia é usar uma árvore de sufixos para S equipada com consultas de ancestrais comuns mais baixas em tempo constante .
Portanto, podemos verificar se uma string S de comprimento m é uma concatenação de palíndromos no tempo O (n).
*
Gusfield, Dan (1997), "9.2 Encontrando todos os palíndromos máximos em tempo linear", Algoritmos em Strings, Árvores e Sequências