Antes de tudo, devemos ler uma palavra e o tamanho desejado.
Então precisamos encontrar o palíndromo mais longo criado por caracteres nesta palavra, usado em ordem.
Por exemplo, para tamanho = 7 e palavra = "abcababac", a resposta é 7 ("abababa").
Postscript: o tamanho da palavra é menor que 3000.
algorithms
strings
subsequences
Gilles 'SO- parar de ser mau'
fonte
fonte
Respostas:
Existe um algoritmo com o nome do algoritmo de Manacher, que é realmente rápido, um algoritmo de tempo linear.
Veja a referência da Wikipedia
Pós-escrito: Se você realmente conhece o algoritmo Z , verá que eles são parecidos.
Editar
Entendi mal o significado do OP (mas não quero excluir as informações de procedimento. É um pouco útil). Ele significa a subsequência palíndrica mais longa de uma string, portanto a programação dinâmica parece boa: onde denota o comprimento da maior subsequência palíndrica de , e é o suporte de Iverson. Eu acho que é como LCS .
fonte
O algoritmo mais rápido que consigo pensar é aplicar o LCS de maneira criativa. Ele pode resolver esse problema no tempo O (N ^ 2) e no espaço O (N ^ 2) em que N é o tamanho da string.
LCS (S, reverso (S)) fornecerá a maior subsequência palindrômica, pois a maior subsequência palindrômica será a maior subsequência comum entre a cadeia S e seu inverso.
Por exemplo,
S = "abcababac"
T = "cababacba" (reverso de S)
LCS (S, T) = "abababa"
fonte
O problema de encontrar o LPS de uma string pode ser convertido em encontrar a Subseqüência Comum Mais Longa de duas strings. Nesse caso, uma sequência será a original e a segunda será o inverso da sequência original.
O problema de Subseqüência Comum Mais Longa é como o problema de correspondência de padrões, exceto que você pode pular caracteres no texto. Além disso, o objetivo é retornar apenas uma partida, o maior tempo possível.
O LCS pode ser resolvido em usando Recursão e Memoização.O(n2)
Existe um algoritmo um pouco mais rápido descoberto por Masek e Paterson da complexidade de tempo . Artigo : Masek e PatersonO(n2/lgn)
Dois outros algoritmos apresentados por Hirschberg para calcular LCS de duas seqüências (tamanho ) e (tamanho ). Com base no pressuposto de que os símbolos que podem aparecer nessas seqüências de caracteres vêm de algum alfabeto de tamanho (isso é realmente verdade na maioria dos casos). Portanto, os símbolos podem ser armazenados na memória usando os bits , que caberão em uma palavra da memória. dois símbolos podem ser comparados no tempo . O número de diferentes na cadeia é indicado por , que é obviamente menor que e .A n B m t log(t) O(1) B s m t
Este requer tempo em que é a duração do LCS. Isso é usado quando se espera que o comprimento do LCS seja pequeno. Quando resolvemos esse problema usando a Programação Dinâmica, descobrimos que a maioria das entradas na matriz é a mesma, para que possamos usar a idéia de Programação Dinâmica Esparsa.O(pn+nlgn) p
Esse algoritmo requer tempo . Isso é muito eficiente quando o comprimento do LCS é próximo de , nesse caso, será próximo de .O(p(m+1−p)logn) m O(nlgn)
Procedimentos e algoritmos detalhados são explicados no artigo de Hirschberg .
Um outro bom algoritmo é proposto por Sohel Rahman que é executado no tempo , em que é o número total de pares ordenados de posições nas quais as cadeias correspondem. Não é aplicável quando é a ordem de , mas há muitos casos em que é a ordem de . Este usa o conceito RMQ (Range Maximum Query). Artigo: RahmanO(Rloglogn) R R O(n2) R n
fonte
Provavelmente estou perdendo alguma coisa, porque me parece bastante trivial: tente parear cada personagem com um personagem igual. Em seguida, coloque o primeiro caractere de cada par no lado esquerdo, o outro caractere no lado direito e, se houver algum caractere restante (ou seja, caracteres não emparelhados com outro), escolha um deles e coloque-o no meio.
fonte