Comment Reverse une chaîne de caractères dans Java en utilisant la récursivité
⚡ Résumé intelligent
Reversing a string in Java La récursivité fonctionne en retirant le premier caractère, en inversant le reste, puis en ajoutant ce premier caractère à la fin. Une chaîne vide interrompt les appels et dépile la pile.
Dans cet exemple de programme, nous inverserons une chaîne saisie par un utilisateur.
Nous allons créer une fonction pour inverser une chaîne. Later Nous procéderons par récursivité jusqu'à ce que tous les caractères soient inversés. La récursivité convient à ce problème car une chaîne inversée est simplement la fin de la chaîne inversée, le premier caractère original étant ajouté à la fin ; il s'agit du même problème, mais avec un caractère de moins.
Rediger un Java Programme à Reverse Chaîne
La classe ci-dessous déclare l'entrée dans la fonction main(), la transmet à reverseString() et affiche le résultat. Deux appels à println() à l'intérieur de la méthode permettent de visualiser chaque étape récursive dans la console.
package com.guru99; public class ReverseString { public static void main(String[] args) { String myStr = "Guru99"; //create Method and pass and input parameter string String reversed = reverseString(myStr); System.out.println("The reversed string is: " + reversed); } //Method take string parameter and check string is empty or not public static String reverseString(String myStr) { if (myStr.isEmpty()){ System.out.println("String in now Empty"); return myStr; } //Calling Function Recursively System.out.println("String to be passed in Recursive Function: "+myStr.substring(1)); return reverseString(myStr.substring(1)) + myStr.charAt(0); } }
Code Sortie :
Chaque ligne du résultat correspond à un appel récursif. La fin de chaque ligne est plus courte d'un caractère que la ligne précédente, et la dernière ligne affiche le résultat inversé.
String to be passed in Recursive Function: uru99 String to be passed in Recursive Function: ru99 String to be passed in Recursive Function: u99 String to be passed in Recursive Function: 99 String to be passed in Recursive Function: 9 String to be passed in Recursive Function: String in now Empty The reversed string is: 99uruG
Comment la récursivité Reversal fonctionne étape par étape
La méthode complète se compose de deux lignes. Le cas de base, `if (myStr.isEmpty())`, indique à la récursion où s'arrêter. La ligne récursive, `return reverseString(myStr.substring(1)) + myStr.charAt(0)`, divise le travail en deux : `substring(1)` représente tout ce qui suit le premier caractère, et `charAt(0)` représente ce premier caractère, ajouté à la fin. après le reste inversé.
Tracl'entrée Guru99 clarifie l'ordre. Java insère une image pour chaque appel avant toute concaténation :
| Appeler | myStr | Passé à l'appel suivant | Expression en attente de fin |
|---|---|---|---|
| 1 | Guru99 | uru99 | reverseString(“uru99”) + G |
| 2 | uru99 | ru99 | reverseString(“ru99”) + u |
| 3 | ru99 | u99 | reverseString(“u99”) + r |
| 4 | u99 | 99 | reverseString("99") + u |
| 5 | 99 | 9 | reverseString(“9”) + 9 |
| 6 | 9 | (Vide) | reverseString(“”) + 9 |
| 7 | (Vide) | scénario de base atteint | renvoie la chaîne vide |
La pile se déroule ensuite de bas en haut, et chaque image ajoute son caractère sauvegardé : la chaîne vide devient 9, puis 99, puis 99u, 99ur, 99uru, et enfin… 99uruG. Car Java Les chaînes de caractères sont immuables, aucune de ces valeurs intermédiaires ne remplace la précédente — chaque concaténation alloue un nouvel objet String.
Deux détails de la sortie console méritent d'être soulignés. La sixième ligne ne contient rien après les deux-points, car la fonction `substring(1)` appliquée à une chaîne d'un seul caractère renvoie la chaîne vide et non `null`. Le message suivant, « String in now Empty » dans le programme original, est une faute de frappe : il s'agit de « String is now empty ». Cette formulation a été conservée afin que le code et la sortie ci-dessus correspondent parfaitement.
Autres façons de Reverse une chaîne de caractères dans Java
La récursivité est la méthode la plus claire pour sur le lien L'inversion peut se produire, mais rarement de la manière dont le code en production se comporte. Trois alternatives couvrent la quasi-totalité des cas réels.
1. StringBuilder.reverse() C'est la plus courte et la plus rapide. La classe possède une méthode reverse() intégrée, ce qui permet d'effectuer l'opération complète en une seule ligne :
String reversed = new StringBuilder(myStr).reverse().toString();
2. Une boucle for avec charAt() parcourt la chaîne à rebours, du dernier indice jusqu'à zéro. Les recruteurs demandent souvent cette version car elle illustre la logique au lieu de la déléguer :
String reversed = ""; for (int i = myStr.length() - 1; i >= 0; i--) { reversed = reversed + myStr.charAt(i); }
3. Un échange de deux pointeurs sur toCharArray() convertit la chaîne en un tableau de caractères, puis échange les caractères les plus extérieurs vers l'intérieur jusqu'à ce que les pointeurs se rejoignent au milieu :
char[] chars = myStr.toCharArray(); int left = 0; int right = chars.length - 1; while (left < right) { char temp = chars[left]; chars[left] = chars[right]; chars[right] = temp; left++; right--; } String reversed = new String(chars);
Cette même technique de manipulation de tableaux inverse une séquence numérique ou toute autre collection ordonnée, ce qui explique sa présence dans… Java tableau des exercices aussi souvent que dans les cordes.
Complexité temporelle et spatiale de chaque approche
Les quatre versions n'ont pas le même coût. Les deux équations quadratiques ci-dessous ont une cause commune : elles créent une nouvelle chaîne de caractères à chaque étape, et copier n caractères n fois représente un travail de complexité n².
| Approche | Heure | Espace supplémentaire | Pourquoi |
|---|---|---|---|
| Récursion avec sous-chaîne() | O(n²) | O(n²) | La fonction substring() copie les caractères restants à chaque appel, et une trame de pile est conservée par caractère. |
| boucle for avec charAt() et + | O(n²) | O(n²) | Chaque concaténation alloue une nouvelle chaîne de caractères et copie tout ce qui a été collecté jusqu'à présent. |
| StringBuilder.reverse() | O (n) | O (n) | Un tampon modifiable, un passage, et les paires de substitution sont conservées intactes |
| Deux pointeurs sur toCharArray() | O (n) | O (n) | Une copie du tableau, puis n/2 échanges sans allocation supplémentaire. |
Choisissez la version récursive pour apprendre ou démontrer le comportement de la pile d'appels, la version avec tableau de caractères lorsqu'un recruteur vous demande la logique détaillée, et `StringBuilder.reverse()` dans tout produit distribué. Ce même compromis entre une solution pédagogique et une solution de production se retrouve dans tous les exercices classiques. tri à bulles et la Série Fibonacci à vérifications de nombres premiers; chacune mérite d'être pratiquée dans Java dans les deux sens.
