Existe um algoritmo de tempo linear para verificar se uma sequência de caracteres é uma concatenação de palíndromos? A única coisa que me vem à cabeça é a solução ingênua:
1. k = 1
2. Split string into k substrings (all possibilities) and check
3. k++
4. repeat
Nota: a resposta é trivialmente sim se as sequências de comprimento 1 forem definidas como palíndromos. Vamos supor que esse não seja o caso.
algorithms
efficiency
strings
saadtaame
fonte
fonte
Respostas:
Supondo que você queira palíndromos separados, isso é conhecido como problema do PALSTAR e existe um algoritmo de tempo linear por Zvi Galil e Joel Seiferas. Um algoritmo de reconhecimento on-line em tempo linear para `` Palstar '' .
Você pode encontrar uma explicação do algoritmo no livro aqui: Algoritmos de texto (consulte a página vinculada e as páginas anteriores).
Se você concorda com um algoritmo de tempo quadrático, a programação dinâmica direta parece funcionar.
Dada uma strings[1,…n] , mantemos uma matriz nos dizendo se s[1,…j] pode ser decomposto em palíndromos.
Também mantemos uma tabela 2D que nos diz ses[i,…j] é um palíndromo ou não. Isso podemos construir emO(n2) escolhendo um centro e movendo dois ponteiros para fora, procurando palíndromos com esse centro. Faça isso para cada centro possível:Θ(n) centros, cada um O(n) Tempo.
Agora você pode conferirs[1,…j+1] se pode ser decomposto em palíndromos, verificando cada 1≤i≤j−1 se s[1,…i] pode ser decomposto e se s[i+1,…,j+1] é um palíndromo (usando a tabela 2D acima). Isso produz umΘ(n2) tempo e Θ(n2) algoritmo espacial.
O uso do espaço pode ser reduzido paraO(n) , se você usar o algoritmo on-line do Manacher para calcular se s[i+1,…j+1] é um palíndromo (como i vai de j−1 para 1 ), basicamente se livrando da tabela 2D.
fonte
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
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: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ênciasfonte
nana
não é um palíndromo, suponho que você quis dizeranana
.Suponha que o Palindrome [] [] seja uma matriz e o Palindrome (i, j) seja uma função que verifica se a subseqüência de i para j é palíndromo e retorna 1 se é palíndromo ou retorna infinito se não for palíndromo e você está procurando o menor número de partições, crie-a de baixo para cima:
Você deve preencher células e cada célula recebe no máximo para que o algoritmo seja . Com uma pequena modificação (pré-processamento), você pode aprimorá-lo para . encontrar esta partição não é difícil.O(n2) O(n) O(n3) O(n2)
fonte
abbaaccaabba.