[RESOLVIDO] Palíndromos

Fala, pessoal! Blz?

Sou iniciante e estou fazendo o seguinte programinha, um exercício que valida se uma palavra é um palíndromo ou não:

import java.util.Scanner;

    public class Ex1 {
    	public static void main(String[]args) {
    		Scanner sc = new Scanner(System.in);
    		
    		System.out.println("Digite uma palavra ou frase:");
    		String palavra = sc.nextLine();
    		String palindromo = "";
    		
    		for(int i = palavra.length() -1; i >= 0; i--){
    			
    			palindromo += palavra.charAt(i);

    		}
    		
    		if(palindromo.equals(palavra)) {
    			System.out.print("É um palíndromo!" + "\n" + palindromo);
    		}
    		else {
    			System.out.print("Não é um palíndromo!" + "\n" + palindromo);
    			
    		}
    		sc.close();
    	}

    }

Estou com o seguinte problema: Para apenas 1 palavra, o programa entrega o resultado perfeitamente.
Para frases, o programa não consegue entregar o resultado correto, mesmo sendo um palíndromo, como a seguinte frase:

socorram me subi no onibus em marrocos

Gostaria de sugestões para a solução do problema!
Muito obrigado, desde já!
Happy code for ya!

2 curtidas

Realmente do jeito que você faz com frase fica complicado saber se é Palíndromo, porque a sequencia de letras é o que vale não a forma de que resulta. Um técnica para resolver isso seria:

String palavra = "Roma me tem amor".replace(" ","").toLowerCase();
String palindromo = "";
		
for(int i = palavra.length() -1; i >= 0; i--)
{
	palindromo += palavra.charAt(i);
}
System.out.println(palindromo);
System.out.println(palavra);
System.out.println(palindromo.equals(palavra));

Ou seja, tirando os espaços e colocar tudo em minúsculos para ter um resultado assim:

Success	#stdin #stdout 0.07s 2184192KB
romametemamor
romametemamor
true

conforme código logo acima.

Observação: uma dica sempre faz break point no código e analise o resultado.

Um exemplo de como a string deve ter uma formatação padrão (sem acentos, sem espaços) é essa frase:

Olé! Maracujá, caju, caramelo!

Se você não tirar os acentos nunca vai dar certo, então o código deve também remover acentos, virgulas, você deve conferir apenas as letras …

Resumindo é um código bem particular, cheio de regras que aos poucos deve ser colocadas no código!

2 curtidas

Entendi!

Muito obrigado pelos esclarecimentos e dicas!

2 curtidas

Outro esqueminha da hora, deixa vc um pouco preguiçoso na parte da lógica mas é bom conhecer até para ver outras formas de fazer:

String palavra = "arara";
String palindromo = new StringBuilder(palavra).reverse().toString();

if (palavra.equals(palindromo)) {
    ...
}

Sucesso nos estudos!

2 curtidas

Opa, fala @rodevops!

Eu já tinha visto esta solução, porém como você mesmo falou, deixa um pouco preguiçoso na parte da lógica. Eu havia visto alguns exemplos com stringBuilder e stringBuffer, mas eu queria fazer algo mais “manual” mesmo.

Agradeço a atenção!

Happy code!

3 curtidas

Outra forma, iterando só até a metade do array.

private boolean palindromo(String palavra) {
    char[] letras = palavra.replace(" ", "").toCharArray();
    int inicio = 0;
    int meio = letras.length / 2;
    int fim = letras.length - 1;
    while (inicio < meio) {
        if (letras[inicio++] != letras[fim--]) {
            return false;
        }
    }
    return true;
}

Exemplo:

String[] textos = {
        "socorram me subi no onibus em marrocos",
        "ana",
        "banana",
        "arara"
};
for (String texto : textos) {
    System.out.println(texto + (palindromo(texto) ? " - sim" : " - não"));
}
3 curtidas