prithvi
prithvi

Reputation: 1

Recursively reverse string Java

I tried to recursively reverse a string in Java, but I am getting just the last character as output.

I looked up online and most of the codes have modified the input string. I am trying to build the output from empty string to reversed string. Please tell me what is wrong in my program.

class reverseStringRecursion
{
    public static void main(String args[])
    {
        System.out.println(reverse());
    }

    public static String reverse()
    {
        String strInput = " Hello I am my name.";
        String output = "";
        return recursiveHelper(strInput, 0, output);
    }

    public static String recursiveHelper(String strInput, int index, String output)
    {
        if(index == (strInput.length() - 1 ))
            output += strInput.charAt(index) + "";
        else
            output+= recursiveHelper(strInput, index + 1, output) +"";

        return output;
    }
}

The above code is returning output '.' only and nothing else. PLease help.

Upvotes: 0

Views: 2272

Answers (7)

Purva
Purva

Reputation: 411

1) Base case if left>=right - do nothing

2) otherwise swap s[left] and s[right} and call helper(left+1, right-1)].

class Solution {
public void reverseString(char[] s) {
    int left = 0, right = s.length - 1;
    while (left < right) {
        char tmp = s[left];
        s[left++] = s[right];
        s[right--] = tmp;
    }
}

}

Upvotes: 0

Messi
Messi

Reputation: 25

public class Main
{
    public static void main(String[] args) {

        String str1="abc";
        String str2="";
        for(int i=str1.length()-1;i>=0;i--)
        {
          str2=str2+Character.toString(str1.charAt(i));
        }
        System.out.println("After Reverse: "+str2);
    }
}

Upvotes: 0

Sanjucta
Sanjucta

Reputation: 127

Modified your class:

public class ReverseStringRecursion {

    public static void main(String args[])
    {
        System.out.println(reverse());
    }

    public static String reverse()
    {
        String strInput = "My Name is Jane Doe";
        String output = "";
        return recursiveHelper(strInput,0);
    }

    public static String recursiveHelper(String strInput, int index)
    {
        if(index == (strInput.length() - 1 ))
            return "" + strInput.charAt(index) ;
        else 
            return recursiveHelper(strInput,index+1) + strInput.charAt(index);
    }
}

Upvotes: 0

Rafavr7
Rafavr7

Reputation: 1

I would change your function recursiveHelper() to only receive one argument (the String that you want to reverse). Using the substring method from Java you can do it like this:

public static String recursiveHelper(String strInput) {
    if(strInput.length() == 1) {
        return strInput;
    }
    else if(strInput == "") {
        return "";
    }

    String subString1 = recursiveHelper(strInput.substring(0, strInput.length()/2));    // Here we copy the first half of the String to another String
    String subString2 = recursiveHelper(strInput.substring(strInput.length()/2));    // Here we do the same, but with the second half of the original String

    return susbString2 + subString1;    // It is very important that you sum the two substrings in this order!
}

Upvotes: 0

Eran
Eran

Reputation: 393811

Since strInput always contains the original String, the following condition makes sure your code only takes the last character of that String and ignore all the other characters:

if(index == (strInput.length() - 1 ))
    output += strInput.charAt(index) + "";

To build the reversed String recursively, you have to append the last character of the String to the reverse of the sub-string of the first length()-1 characters.

This means that you don't need the 2nd and 3rd arguments of your method, and strInput should be passed a shorter String in each recursive call.

public static String reverse (String strInput)
{
    if(strInput.length() <= 1)
        return strInput;
    else
        return strInput.charAt(strInput.length()-1) + reverse (strInput.substring(0,strInput.length()-1));
}

Upvotes: 0

user94559
user94559

Reputation: 60143

Others have done a good job of explaining why your code doesn't work. For comparison, here's a working version with some comments:

public static void main(String args[])
{
    System.out.println(reverse("Hello I am my name."));
}

public static String reverse(String text)
{
    // Base case:
    // If the string is empty, we're done.
    if (text.length() == 0) {
        return "";
    } else {
        // reverse("hello") = reverse("ello") + "h"
        return reverse(text.substring(1)) + text.charAt(0);
    }
}

Upvotes: 4

luizfzs
luizfzs

Reputation: 1458

Since String in Java are immuatable, passing it by parameter is useless on this case, so I removed it.

public class Main {
    public static void main(String args[]) {
        System.out.println(reverse());
    }

    public static String reverse() {
        String strInput = " Hello I am my name.";
        return recursiveHelper(strInput, 0);
    }

    public static String recursiveHelper(String strInput, int index) {
        String output;
        if(index == (strInput.length() - 1 )){
            output = strInput.charAt(index) + "";
        }else{
            output = recursiveHelper(strInput, index + 1) + strInput.charAt(index);
        }
        return output;
    }
}

Try it online!

Upvotes: 0

Related Questions