Hvordan Reverse en streng i Java ved hjelp av rekursjon

⚡ Smart oppsummering

Revå slette en streng inn Java Med rekursjon fungerer det ved å fjerne det første tegnet, reversere det som er igjen, og legge til det første tegnet på slutten. En tom streng stopper kallene og avvikler stakken.

  • 🔘 Grunnveske: Metoden returnerer umiddelbart når isEmpty() rapporterer at ingenting er igjen å reversere.
  • ☑️ Rekursivt trinn: substring(1) fjerner det første tegnet og charAt(0) setter det tilbake etter den reverserte resten.
  • uforanderlighet: Hvert kall produserer et nytt String-objekt, fordi a Java Strengen kan aldri redigeres på stedet.
  • 🧪 Trace: Guru99 blir 99uruG etter sju kall, ett for hvert tegn pluss det tomme basistilfellet.
  • 🛠️ Raskere alternativer: StringBuilder.reverse() og et to-peker-bytte over til CharArray() fullføres begge i én omgang.
  • 📌 Kostnad: Rekursjon med substring() kjører i kvadratisk tid og inneholder én stakkramme per tegn.

Java et program som reverserer en streng ved hjelp av en rekursiv metode

I dette eksempelprogrammet vil vi reversere en streng som er skrevet inn av en bruker.

Vi vil lage en funksjon for å reversere en streng. Later Vi kaller det rekursivt til alle tegnene er reversert. Rekursjon passer til dette problemet fordi en reversert streng ganske enkelt er den reverserte halen av strengen med det opprinnelige første tegnet fast på enden, som er det samme problemet ett tegn mindre.

Skriv en Java Program til Reverse String

Klassen nedenfor deklarerer inputen i main(), gir den til reverseString(), og skriver ut det som kommer tilbake. To println()-kall inne i metoden gjør hvert rekursive trinn synlig i konsollen.

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 Utgang:

Hver linje i utdataene er ett rekursivt kall. Halen som er trykt på hver linje er ett tegn kortere enn linjen over, og den siste linjen viser det omvendte resultatet.

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

Hvordan den rekursive Reversal Works trinn for trinn

To linjer bærer hele metoden. Basistilfellet, if (myStr.isEmpty()), gir rekursjonen et sted å stoppe. Den rekursive linjen, return reverseString(myStr.substring(1)) + myStr.charAt(0), deler arbeidet i to: substring(1) er alt etter det første tegnet, og charAt(0) er det første tegnet, lagt til. etter den omvendte resten.

Tracinnspillingen Guru99 gjør rekkefølgen tydelig. Java skyver én ramme for hvert kall før noen sammenkobling skjer:

AnropminStrOverført til neste samtaleUttrykk venter på å bli ferdig
1Guru99uru99reverseString(“uru99”) + G
2uru99ru99reverseString(“ru99”) + u
3ru99u99reversString(“u99”) + r
4u9999reversString("99") + u
5999reversString("9") + 9
69(tømme)reversString(“”) + 9
7(tømme)basisscenariet er nåddreturnerer den tomme strengen

Stakken rulles deretter ut nedenfra og opp, og hver ramme legger til sitt lagrede tegn: den tomme strengen blir 9, deretter 99, deretter 99u, 99ur, 99uru, og til slutt 99uruG. Fordi Java Strenger er uforanderlige, ingen av disse mellomverdiene overskriver den forrige – hver sammenkobling tildeler et nytt String-objekt.

To detaljer i konsollutdataene er verdt å nevne. Den sjette linjen slutter med ingenting etter kolon, fordi substring(1) på en streng med ett tegn returnerer den tomme strengen i stedet for null. Meldingen som følger lyder «String in now Empty» i det opprinnelige programmet; formuleringen er en skrivefeil for «String is now empty» og har blitt latt urørt, slik at koden og utdataene ovenfor fortsatt samsvarer linje for linje.

Andre måter å Reverse en streng i Java

Rekursjon er den klareste måten å se reverseringen skjer, men det er sjelden slik produksjonskoden gjør det. Tre alternativer dekker nesten alle reelle tilfeller.

1. StringBuilder.reverse() er den korteste og raskeste. Klassen har en innebygd reverse()-metode, slik at hele jobben får plass på én linje:

String reversed = new StringBuilder(myStr).reverse().toString();

2. En for-løkke med charAt() går strengen bakover fra siste indeks til null. Intervjuere ber ofte om denne versjonen fordi den viser logikken i stedet for å delegere den:

String reversed = "";
for (int i = myStr.length() - 1; i >= 0; i--) {
    reversed = reversed + myStr.charAt(i);
}

3. En to-poengs bytte over til CharArray() konverterer strengen til en char-array, og bytter deretter de ytterste tegnene innover til pekerne møtes i midten:

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

Den samme arrayteknikken reverserer en numerisk sekvens eller en hvilken som helst annen ordnet samling, og det er derfor den dukker opp i Java matrise øvelser like ofte som i strengøvelser.

Tids- og romkompleksiteten til hver tilnærming

De fire versjonene koster ikke det samme. Begge de kvadratiske oppføringene nedenfor deler én grunn: de oppretter en helt ny streng i hvert trinn, og å kopiere n tegn n ganger er n kvadratisk arbeid.

TilnærmingTidEkstra plassHvorfor
Rekursjon med delstreng()O(n²)O(n²)substring() kopierer de gjenværende tegnene på hvert kall, og én stakkramme holdes per tegn
for-løkke med charAt() og +O(n²)O(n²)Hver sammenkobling tildeler en ny streng og kopierer alt som er samlet inn så langt.
StringBuilder.reverse()O (n)O (n)Én muterbar buffer, én passasje og surrogatpar holdes intakte
To pekere over tilCharArray()O (n)O (n)Én arraykopi, deretter n/2 bytter uten ytterligere allokering

Velg den rekursive versjonen for å lære eller demonstrere hvordan kallstakken oppfører seg, char-array-versjonen når en intervjuer ber om logikken manuelt, og StringBuilder.reverse() i alt som sendes. Den samme avveiningen mellom en undervisningsløsning og en produksjonsløsning dukker opp på tvers av de klassiske øvelsene, fra boblesortering og Fibonacci-serien til primtallssjekker; hver enkelt er verdt å øve på Java begge veier.

Spørsmål og svar

Stringobjekter er uforanderlige, så tegnene i et objekt kan aldri endres etter opprettelse. Hver reversering bygger derfor et nytt objekt. Bruk StringBuilder eller en char-array når tegnene må endres uten å tildele en ny streng i hvert trinn.

Det første kallet til isEmpty() kaster en NullPointerException, fordi metoden kalles på ingenting. Beskytt inngangspunktet med en null-sjekk som returnerer null eller kaster IllegalArgumentException før noen rekursjon starter.

Ikke pålitelig. charAt() fungerer på 16-bits kodeenheter, slik at et tegn lagret som et surrogatpar deles og den reverserte teksten viser erstatningskvadrater. StringBuilder.reverse() holder surrogatpar sammen, noe som gjør det til et tryggere valg for Unicode-tekst.

StringBuilder, i nesten alle tilfeller. Begge eksponerer den samme reverse()-metoden, men StringBuffer synkroniserer hver samtale, noe som koster fart. Velg StringBuffer bare når én buffer genuint deles mellom tråder.

Del setningen på mellomrom med split(" "), og gå deretter den resulterende tabellen fra den siste indeksen til den første, og legg til hvert ord i en StringBuilder. Tegnene i hvert ord forblir i sin opprinnelige rekkefølge.

Én stakkramme brukes per tegn, så noen få tusen tegn er typisk før en StackOverflowError vises. Den nøyaktige grensen avhenger av JVM-trådstakkens størrelse. Enhver iterativ versjon unngår taket fullstendig.

En AI-assistent kan lese en stabel trace.g. peker på et manglende eller utilgjengelig basistilfelle, og forklarer rekkefølgen rammer avvikles i. Den utarbeider også kanttilfelletester for tom, enkelttegns- og null-input. Bekreft resonnementet mot en reell kjøring.

Ja. copilot fullfører vanligvis en hel revers metode bare fra signaturen, og tilbyr ofte StringBuilder-formen først. Sjekk basistilfellet og kompleksiteten, fordi det korteste forslaget ikke alltid er den versjonen en øvelse ber om.

Oppsummer dette innlegget med: