在java中使用递归反转字符串

在java中使用递归反转字符串,java,recursion,substring,reverse,Java,Recursion,Substring,Reverse,我想把一整根绳子倒过来。例如,Cat正在运行时应给出输出running is Cat 我已经尝试了很多,但是我做不到。它显示gninnur SITAC。请帮助我,它应该把猫作为一个单一的字符,而不是把“c”作为一个单一的字符 代码如下: public static void main(String[] args) { String str = "Cat is running"; System.out.println("Before recursion: " + str);

我想把一整根绳子倒过来。例如,Cat正在运行时应给出输出running is Cat

我已经尝试了很多,但是我做不到。它显示gninnur SITAC。请帮助我,它应该把猫作为一个单一的字符,而不是把“c”作为一个单一的字符

代码如下:

public static void main(String[] args) {
    String str = "Cat is running";
    System.out.println("Before recursion: " + str);
    System.out.println("After recursion: " + reverse(str));
}

public static String reverse(String str) {
    if(str.isEmpty())
        return str;

    String s = "";
    for(int i = 0; i < str.length(); i++) {
        s = s + str.charAt(i);
    }
    return reverse(s.substring(1)) + s.charAt(0);   
}

您必须找到字符串中的第一个单词,将字符串的其余部分传递给递归调用,并在末尾追加第一个单词:

public static String reverse(String str) {
    if(str.isEmpty() || !str.contains(" "))
        return str;

    int sep = str.indexOf(' ');
    return reverse(str.substring(sep+1)) + " " + str.substring(0,sep);   
}
输出:

Before recursion: Cat is running
After recursion: running is Cat
顺便说一句,循环是你的原始代码是没有意义的。您可以直接使用str,而不是创建它的副本

您可以通过以下方式将其缩短:

public static String reverse(String str) {
    int sep = str.indexOf(' ');
    return sep >= 0 ? reverse(str.substring(sep+1)) + " " + str.substring(0,sep) : str;
}

我想我让它比@Eran差了一点,但我已经写了:

private static String reverse(String str) {
    if (str.isEmpty() || !str.contains(" "))
        return str;
    StringBuilder sb = new StringBuilder(" ");
    int i = 0;
    while (i < str.length() && str.charAt(i) != ' ') {
        sb.append(str.charAt(i));
        i++;
    }
    return reverse(str.substring(i + 1)) + sb.toString();
}

你能证明这些说法是正确的吗!str.contais和str.indexOf“”。我无法理解它。这些语句中实际发生了什么?@Yahya如果字符串不包含空格,则表示它只有一个单词,不应反转。因此,这是一个错误!str.contains检查。一旦知道字符串在空间列表中的位置,我们就使用indexOf“”来定位第一个空间的索引。然后我们使用子字符串将第一个单词与字符串的其余部分分开。我们将字符串的其余部分传递给下一个递归调用,然后在末尾附加一个空格+第一个单词。