por exemplo, "ccddcc" na string "abaccddccefe"
Pensei em uma solução, mas ela funciona em tempo O (n ^ 2)
Algo 1:
Passos: é um método de força bruta
- Tenha 2 loops
for para i = 1 a i menor que array.length -1
para j = i + 1 a j menor que array.length - Desta forma, você pode obter substring de todas as combinações possíveis do array
- Possui uma função de palíndromo que verifica se uma string é palíndromo
- então para cada substring (i, j) chame esta função, se for um palíndromo armazene-a em uma variável de string
- Se você encontrar a próxima substring de palíndromo e se ela for maior que a atual, substitua-a pela atual.
- Finalmente sua variável de string terá a resposta
Problemas: 1. Este algo é executado em tempo O (n ^ 2).
Algo 2:
- Inverta a string e armazene-a em uma matriz diferente
- Agora encontre a maior substring correspondente entre ambas as matrizes
- Mas isso também é executado no tempo O (n ^ 2)
Vocês podem pensar em um algo que funciona em um momento melhor. Se possível, tempo O (n)
algorithm
palindrome
Aprendiz
fonte
fonte
O(n^2)
pegar os substrings *O(n)
para verificar se são palíndromos, para um total deO(n^3)
?Respostas:
Você pode encontrar o palíndromo mais longo usando o algoritmo de Manacher no
O(n)
tempo! Sua implementação pode ser encontrada aqui e aqui .Para entrada
String s = "HYTBCABADEFGHABCDEDCBAGHTFYW1234567887654321ZWETYGDE"
, encontra a saída correta, que é1234567887654321
.fonte
while
embutido nofor
com um limite que parece semelhante ao loop externo.O Algo 2 pode não funcionar para todas as cordas. Aqui está um exemplo de tal string "ABCDEFCBA".
Não que a string tenha "ABC" e "CBA" como substring. Se você inverter a string original, será "ABCFEDCBA". e a substring correspondente mais longa é "ABC", que não é um palíndromo.
Você pode precisar verificar adicionalmente se esta substring correspondente mais longa é na verdade um palíndromo que tem o tempo de execução de O (n ^ 3).
fonte
Pelo que entendi o problema, podemos encontrar palíndromos em torno de um índice central e abranger nossa pesquisa nos dois sentidos, à direita e à esquerda do centro. Dado isso e sabendo que não há palíndromo nos cantos da entrada, podemos definir os limites para 1 e comprimento-1. Prestando atenção aos limites mínimo e máximo da String, verificamos se os caracteres nas posições dos índices simétricos (direita e esquerda) são os mesmos para cada posição central até chegarmos ao centro do limite superior máximo.
O loop externo é O (n) (max n-2 iterações), e o loop while interno é O (n) (max ao redor (n / 2) - 1 iterações)
Aqui está minha implementação Java usando o exemplo fornecido por outros usuários.
O resultado disso é o seguinte:
fonte
expandAroundCenter
.com regex e ruby, você pode escanear palíndromos curtos como este:
fonte
Eu escrevi o seguinte programa Java por curiosidade, HTH simples e autoexplicativo. Obrigado.
fonte
Esta pergunta me foi feita recentemente. Aqui está a solução que eu [eventualmente] encontrei. Fiz isso em JavaScript porque é muito simples nessa linguagem.
O conceito básico é que você percorre a linha procurando o menor palíndromo de vários caracteres possível (seja um de dois ou três caracteres). Depois de fazer isso, expanda as bordas em ambos os lados até que deixe de ser um palíndromo. Se esse comprimento for maior do que o atual, armazene-o e siga em frente.
Isso definitivamente poderia ser limpo e otimizado um pouco mais, mas deve ter um desempenho muito bom em todos, exceto no pior cenário (uma string da mesma letra).
fonte
i
j
l
s
if
manutenção de estado. pontos de retorno múltiplo, casosOlá, aqui está o meu código para encontrar o palíndromo mais longo da string. Consulte o seguinte link para compreender o algoritmo http://stevekrenzel.com/articles/longest-palnidrome
Os dados de teste usados são HYTBCABADEFGHABCDEDCBAGHTFYW12345678987654321ZWETYGDE
fonte
Veja o artigo da Wikipedia sobre este tópico. Exemplo de implementação do algoritmo de Manacher Java para solução linear O (n) do artigo abaixo:
fonte
Uma
Regexp
solução eficiente que evita a força brutaComeça com todo o comprimento da string e vai até 2 caracteres, existe assim que uma combinação é feita
Para
"abaccddccefe"
o regexp testa 7 correspondências antes de retornarccddcc
.vbs
vba
função
fonte
fonte
Experimente a string - "HYTBCABADEFGHABCDEDCBAGHTFYW123456789987654321ZWETYGDE"; Deve funcionar para amigos pares e ímpares. Muito obrigado a Mohit!
usando namespace std;
fonte
isPal
- uma operação O (n) - apenas para medir seu comprimento !? Também tem uma tentativa de buggy de manusear até palíndromos. Em erros de palíndromo par:else if(input_str[i] == input_str[j])
nunca pode ser bem-sucedido porque o mesmo teste deve ter falhado naif
instrução anterior ; e é problemático de qualquer maneira porque você não pode dizer apenas olhando para 2 caracteres espaçados por 2 posições se você está olhando para um palíndromo par ou ímpar (considereAAA
eAAAA
).O código a seguir calcula o Palidrom para strings de comprimento par e ímpar.
Não é a melhor solução, mas funciona para ambos os casos
HYTBCABADEFGHABCDEDCBAGHTFYW12345678987654321ZWETYGDE HYTBCABADEFGHABCDEDCBAGHTFYW1234567887654321ZWETYGDE
fonte
Podemos encontrar todos os palíndromos de todos os comprimentos usando isso.
Amostra:
palavra = abcdcbc
ModificadoString = a # b # c # d # c # b # c
palinCount = 1010105010301
comprimento do palíndromo mais longo = 5;
palíndromo mais longo = bcdcb
public class MyLongestPalindrome {
}
fonte
Isso retornará a string mais longa do palíndromo de uma determinada string
== SAÍDA ===
Entrada: abcccde Saída: ccc
Entrada: abcccbd Saída: bcccb
Entrada: abedccde Saída: edccde
Entrada: abcccdeed Saída: escritura
Entrada: abcccbadeed Saída: abcccba
fonte
Aqui está uma implementação em javascript:
fonte
Para solução linear, você pode usar o algoritmo de Manacher. Existe outro algoritmo chamado Algoritmo de Gusfield, e abaixo está o código em java:
Você pode encontrar mais sobre outras soluções, como a melhor solução O (n ^ 2) ou algoritmo de Manacher em meu próprio blog .
fonte
Aqui eu escrevi uma lógica, experimente :)
fonte
Esta solução é de complexidade O (n ^ 2). O (1) é a complexidade do espaço.
fonte
{'DED': 3, '123456789987654321': 18, '67899876': 8, 'ABCDEDCBA': 9, '456789987654': 12, '34567899876543': 14, 'BCDEDCB': 7, 'ABA': 3, ' 5678998765 ': 10,' 2345678998765432 ': 16,' CDEDC ': 5,' 789987 ': 6,' 8998 ': 4} (' 123456789987654321 ', 18)
fonte
Aqui está meu algoritmo:
1) definir o centro atual para ser a primeira letra
2) expandir simultaneamente para a esquerda e para a direita até encontrar o palíndromo máximo em torno do centro atual
3) se o palíndromo que você encontrar for maior do que o palíndromo anterior, atualize-o
4) definir o centro atual como a próxima letra
5) repita os passos 2) a 4) para todas as letras da string
Isso é executado em O (n).
Espero que ajude.
fonte
Referência: Wikipedia.com
O melhor algoritmo que já encontrei, com complexidade O (N)
fonte
minha solução é:
fonte
Substring()
e string-igualdade (==
). É basicamente idêntico ao algo # 1 do OP.