Verifique se uma String é um Palíndromo
1. Introdução
Neste artigo, veremos como podemos verificar se um determinadoString é um palíndromo usando Java.
A palindrome is a word, phrase, number, or other sequences of characters which reads the same backward as forward, como “madame” ou “carro de corrida”.
2. Soluções
Nas seções a seguir, veremos as várias maneiras de verificar se um determinadoString é um palíndromo ou não.
2.1. Uma abordagem simples
Podemos iniciar simultaneamente a iteração dosstring fornecidos para frente e para trás, um caractere por vez. Se houver uma correspondência, o loop continua; caso contrário, o loop sairá:
public boolean isPalindrome(String text) {
String clean = text.replaceAll("\\s+", "").toLowerCase();
int length = clean.length();
int forward = 0;
int backward = length - 1;
while (backward > forward) {
char forwardChar = clean.charAt(forward++);
char backwardChar = clean.charAt(backward--);
if (forwardChar != backwardChar)
return false;
}
return true;
}
2.2. Invertendo a corda
Existem algumas implementações diferentes que se encaixam neste caso de uso: podemos fazer uso dos métodos API das classesStringBuildereStringBuffer ao verificar os palíndromos ou podemos reverter oString sem eles Aulas.
Vamos dar uma olhada nas implementações de código sem as APIs auxiliares primeiro:
public boolean isPalindromeReverseTheString(String text) {
StringBuilder reverse = new StringBuilder();
String clean = text.replaceAll("\\s+", "").toLowerCase();
char[] plain = clean.toCharArray();
for (int i = plain.length - 1; i >= 0; i--) {
reverse.append(plain[i]);
}
return (reverse.toString()).equals(clean);
}
No trecho acima, simplesmente iteramos oString fornecido do último caractere e anexamos cada caractere ao próximo caractere, até o primeiro caractere, revertendo assim oString. fornecido
Finalmente, testamos a igualdade entre o dadoStringeString. invertido
O mesmo comportamento pode ser alcançado usando métodos de API.
Vamos ver uma rápida demonstração:
public boolean isPalindromeUsingStringBuilder(String text) {
String clean = text.replaceAll("\\s+", "").toLowerCase();
StringBuilder plain = new StringBuilder(clean);
StringBuilder reverse = plain.reverse();
return (reverse.toString()).equals(clean);
}
public boolean isPalindromeUsingStringBuffer(String text) {
String clean = text.replaceAll("\\s+", "").toLowerCase();
StringBuffer plain = new StringBuffer(clean);
StringBuffer reverse = plain.reverse();
return (reverse.toString()).equals(clean);
}
No fragmento de código, invocamos o métodoreverse() da APIStringBuildereStringBuffer para reverter oStringe fornecido e testar a igualdade.
2.3. Usando APIStream
Também podemos usar umIntStream para fornecer uma solução:
public boolean isPalindromeUsingIntStream(String text) {
String temp = text.replaceAll("\\s+", "").toLowerCase();
return IntStream.range(0, temp.length() / 2)
.noneMatch(i -> temp.charAt(i) != temp.charAt(temp.length() - i - 1));
}
No snippet acima, verificamos que nenhum dos pares de caracteres de cada extremidade deString atende à condiçãoPredicate.
2.4. Usando recursão
A recursão é um método muito popular para resolver esses tipos de problemas. No exemplo demonstrado, iteramos recursivamente osString fornecidos e testamos para descobrir se é um palíndromo ou não:
public boolean isPalindromeRecursive(String text){
String clean = text.replaceAll("\\s+", "").toLowerCase();
return recursivePalindrome(clean,0,clean.length()-1);
}
private boolean recursivePalindrome(String text, int forward, int backward) {
if (forward == backward) {
return true;
}
if ((text.charAt(forward)) != (text.charAt(backward))) {
return false;
}
if (forward < backward + 1) {
return recursivePalindrome(text, forward + 1, backward - 1);
}
return true;
}
3. Conclusão
Neste tutorial rápido, vimos como descobrir se um determinadoString é um palíndromo ou não.
Como sempre, os exemplos de código para este artigo estão disponíveisover on GitHub.