Vérifier si une chaîne est un Palindrome en Java

1. Introduction

Dans cet article, nous allons voir comment nous pouvons vérifier si une String donnée est un palindrome utilisant Java.

Un palindrome est un mot, une phrase, un nombre ou d'autres séquences de caractères qui se lisent de la même manière en arrière qu'en avant , comme «madame» ou «racecar».

2. Solutions

Dans les sections suivantes, nous examinerons les différentes façons de vérifier si une chaîne donnée est un palindrome ou non.

2.1. Une approche simple

Nous pouvons simultanément commencer à itérer la chaîne donnée en avant et en arrière, un caractère à la fois. S'il y a une correspondance, la boucle continue; sinon, la boucle se termine:

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. Inverser la chaîne

Il existe quelques implémentations différentes qui correspondent à ce cas d'utilisation: nous pouvons utiliser les méthodes API des classes StringBuilder et StringBuffer lors de la vérification des palindromes, ou nous pouvons inverser la chaîne sans ces classes.

Jetons d'abord un coup d'œil aux implémentations de code sans les API d'assistance:

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); }

Dans l'extrait de code ci-dessus, nous itérons simplement la chaîne donnée à partir du dernier caractère et ajoutons chaque caractère au caractère suivant, jusqu'au premier caractère, inversant ainsi la chaîne donnée .

Enfin, nous testons l'égalité entre la chaîne donnée et la chaîne inversée .

Le même comportement pourrait être obtenu en utilisant des méthodes API.

Voyons une démonstration rapide:

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); }

Dans l'extrait de code, nous appelons la méthode reverse () à partir de l' API StringBuilder et StringBuffer pour inverser la String donnée et tester l'égalité.

2.3. Utilisation de l' API Stream

Nous pouvons également utiliser un IntStream pour fournir une solution:

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)); }

Dans l'extrait de code ci-dessus, nous vérifions qu'aucune des paires de caractères de chaque extrémité de la chaîne ne remplit la condition Predicate .

2.4. Utilisation de la récursivité

La récursivité est une méthode très populaire pour résoudre ce genre de problèmes. Dans l'exemple démontré, nous itérons récursivement la chaîne donnée et testons pour savoir s'il s'agit d'un palindrome ou non:

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. Conclusion

Dans ce rapide tutoriel, nous avons vu comment savoir si une chaîne donnée est un palindrome ou non.

Comme toujours, les exemples de code de cet article sont disponibles à l'adresse over sur GitHub.