ClownInTheMoon
ClownInTheMoon

Reputation: 225

Recursion for printing out words in sentence backwards

I'm working on getting a method that prints the words of a sentence out backwards. I'm very close to a solution but am hitting a minor snag.

Here is my code:

public static String reverseString(String str) {

        if (str.equals(""))
            return "";

        else {

            int i = str.length() - 1;

            while (!Character.isWhitespace(str.charAt(i))) {
                if (i - 1 < 0)
                    break;
                i--;
            }

            return str.substring(i,str.length()) + reverseString(str.substring(0,i));
        }

    }

Now the problem is the that the output from my test:

String test = "This is a test.";

System.out.println(reverseString(test));

Is giving me this back:

  test. a isThis

Now, when I try to bump up the index of the substring being returned and add in the spaces manually, it cuts off the "T" in "This". That is, if I decide to instead return as follows:

return str.substring(i+1,str.length()) + " " + reverseString(str.substring(0,i));

then I get back

test. a is his 

Does anyone have any advice or pointers on my implementation in general?

Upvotes: 2

Views: 931

Answers (4)

IDKWhatImDoing
IDKWhatImDoing

Reputation: 147

Working with your code you would just need to add an additional space in front of whatever string you want to reverse such as with this code

reverseString(" " + str)

when you first execute the method.

Upvotes: -1

ItamarG3
ItamarG3

Reputation: 4122

You can change the return statement to this:

return str.substring(i, str.length()).trim() + " " + reverseString(str.substring(0, i));

Upvotes: 2

Raghav
Raghav

Reputation: 4638

In this approach you can selectively create substring based on whitespace. For input This is a test. below method will give return test. a is This. Idea here is if you have a leading space, you will actually convert to trailing space.

public static String reverseString(String str) {

        if (str.equals(""))
            return "";

        else {

            int i = str.length() - 1;

            while (!Character.isWhitespace(str.charAt(i))) {
                if (i - 1 < 0)
                    break;
                i--;
            }
            String substring;

            if(Character.isWhitespace(str.charAt(i)))
            {
                substring= str.substring(i+1,str.length())+" ";
            }
            else
            {
                substring= str.substring(i,str.length());
            }

            return substring + reverseString(str.substring(0,i));
        }

    }

Upvotes: 1

Quagaar
Quagaar

Reputation: 1287

Split the sentence using String.split and then iterate over the resulting array backwards. To split at whitespace do

test.split(" +");

The split method takes a Regular Expression and the above means: split at one or more consecutive whitespaces.

Recursive approach:

public String reverse(final String s) {

    final int pos = s.indexOf(' ');
    if (pos > -1) {
        return reverse(s.substring(pos + 1).trim()) + " " + s.substring(0, pos).trim();
    }

    return s;
}

Upvotes: 2

Related Questions