Um palíndromo é uma palavra, frase, número ou outra sequência de unidades que podem ser lidas da mesma maneira em qualquer direção.
Para verificar se uma palavra é um palíndromo, pego o array char da palavra e comparo os chars. Eu testei e parece funcionar. No entanto, quero saber se está certo ou se há algo para melhorar.
Aqui está o meu código:
public class Aufg1 {
public static void main(String[] args) {
String wort = "reliefpfpfeiller";
char[] warray = wort.toCharArray();
System.out.println(istPalindrom(warray));
}
public static boolean istPalindrom(char[] wort){
boolean palindrom = false;
if(wort.length%2 == 0){
for(int i = 0; i < wort.length/2-1; i++){
if(wort[i] != wort[wort.length-i-1]){
return false;
}else{
palindrom = true;
}
}
}else{
for(int i = 0; i < (wort.length-1)/2-1; i++){
if(wort[i] != wort[wort.length-i-1]){
return false;
}else{
palindrom = true;
}
}
}
return palindrom;
}
}
Respostas:
Por que não apenas:
Exemplo:
A entrada é "andna".
i1 será 0 e i2 será 4.
Vamos comparar a primeira iteração do loop
word[0]
eword[4]
. Eles são iguais, então incrementamos i1 (agora é 1) e diminuímos i2 (agora é 3).Então, comparamos os n's. Eles são iguais, então incrementamos i1 (agora é 2) e diminuímos i2 (é 2).
Agora i1 e i2 são iguais (ambos são 2), então a condição para o loop while não é mais verdadeira, então o loop termina e nós retornamos true.
fonte
Você pode verificar se uma string é um palíndromo comparando-a com o seu reverso:
ou para versões de Java anteriores a 1.5,
EDITAR: @FernandoPelliccioni forneceu uma análise muito completa da eficiência (ou falta dela) desta solução, tanto em termos de tempo quanto de espaço. Se você estiver interessado na complexidade computacional desta e de outras soluções possíveis para esta questão, leia!
fonte
Uma versão concisa, que não envolve (ineficientemente) a inicialização de um monte de objetos:
fonte
Alternativamente, recursão .
Para qualquer pessoa que esteja procurando uma solução recursiva mais curta, para verificar se uma determinada string satisfaz como um palíndromo:
OU ainda mais curto , se desejar:
fonte
return s.charAt(0) == s.charAt(l - 1) && isPalindrome(s.substring(1, l - 1));
Go, Java:
fonte
também uma solução de aparência diferente:
fonte
E aqui está uma solução completa de streaming Java 8 . Um IntStream fornece todos os índices até a metade do comprimento das strings e, em seguida, uma comparação do início e do final é feita.
O resultado é:
fonte
allMatch
comallMatch(i -> str.charAt(i) == str.charAt(str.length() - i - 1))
?fonte
isPalindrome()
com"cbb"
?}
fonte
Eu trabalhei em uma solução para uma questão que foi marcada como duplicata desta. É melhor jogá-lo aqui ...
A questão pedia uma única linha para resolver isso, e eu a tomei mais como o palíndromo literário - portanto, espaços, pontuação e maiúsculas / minúsculas podem confundir o resultado.
Esta é a solução feia com uma pequena classe de teste:
Desculpe que seja meio desagradável - mas a outra pergunta especificava uma linha única.
fonte
Verificando o palíndromo para a primeira metade da corda com o resto, este caso assume a remoção de quaisquer espaços em branco.
fonte
Eu sou novo em java e estou aceitando sua pergunta como um desafio para aprimorar meus conhecimentos.
fonte
Experimente isto:
fonte
fonte
Outra maneira é usar char Array
}
fonte
Aqui está minha análise da resposta @Greg: componentsprogramming.com/palindromes
Sidenote: Mas, para mim é importante fazer isso de forma genérica . Os requisitos são que a sequência seja bidirecionalmente iterável e os elementos da sequência sejam comparáveis usando igualdade. Não sei como fazer em Java, mas, aqui está uma versão C ++, não conheço melhor maneira de fazer para sequências bidirecionais.
Complexidade: tempo linear,
Se I for RandomAccessIterator: comparações de piso (n / 2) e piso (n / 2) * 2 iterações
Se I for BidirecionalIterator: comparações de piso (n / 2) e piso (n / 2) * 2 iterações mais (3/2) * n iterações para encontrar o meio (função do meio)
armazenamento: O (1)
Sem memória dinâmica alocada
fonte
Recentemente, escrevi um programa de palíndromo que não usa StringBuilder. Uma resposta tardia, mas pode ser útil para algumas pessoas.
fonte
Usando pilha, isso pode ser feito assim
fonte
fonte
É incrível quantas soluções diferentes existem para um problema tão simples! Aqui está mais um.
fonte
fonte
Por que não apenas:
fonte
fonte
fonte
Eu estava procurando uma solução que não funcionasse apenas para palíndromos como ...
... mas também para ...
Iterativa : esta se provou uma boa solução.
Recursivo . Acho que essa solução não deve ser muito pior do que a iterativa. É um pouco complicado, precisamos extrair a etapa de limpeza do método para evitar processamento desnecessário.
Invertendo : Esta solução provou ser cara.
Todos os créditos para a galera que está respondendo neste post e trazendo luz ao assunto.
fonte
Considerando não as letras nas palavras
———
fonte
Aqui você pode verificar palíndromo uma série de String dinamicamente
fonte
IMO, a forma recursiva é a mais simples e clara.
fonte
aqui, verificando o maior palíndromo em uma string, sempre começando do primeiro caractere.
fonte
Fragmento de código:
fonte