递归将字符移动到字符串末尾

3

我需要使用递归获取一个字符串并重新排列,通过获取字符并将该字符移动到字符串的结尾来实现。 例如: "Hello world!" , 'l' => "Heo word!lll"。 我不太理解递归思维方式,所以我从下面的代码开始学习:

public static String ChToLast (String str, char ch){
    if(str.indexOf(ch)== -1){
        return str;
    }else{
        if(str.indexOf(0) == ch){
            return str;
        }
    }

感谢您的帮助 :)。

你能详细解释一下你需要做什么吗?我还不是很清楚。 - NocNit
递归基本上有两个主要部分。第一个是结束条件,何时需要停止递归。第二个是继续条件,何时需要方法调用自身? - Bill F
1
@NocNit 从字符串中选取一个字符,并将其所有出现的位置移动到字符串的末尾。 - achAmháin
该函数应该接受一个字符串和一个字符作为参数,并使用递归将我们选择的每个字符移动到字符串的末尾。谢谢您的时间。 - Escaban
如果我的答案解决了你的问题,请将其标记为已接受。这也对我有很大帮助 ;) - NocNit
非常感谢您帮助我理解这个问题,我学到了很多。@NocNit - Escaban
3个回答

3

递归是在方法内部重复使用自己的一种实践。在这种情况下,我将提供一个解决方案来说明发生了什么:

public static String chrToLast(String str, char ch) {
    //This if statement details the end condition
    if(str.length() < 1) {
        return "";
    }

    String newString = str.substring(1); //Create new string without first character

    if(str.indexOf(ch) == 0) { //This happens when your character is found
        return chrToLast(newString, ch) + ch;
    } else { //This happens with all other characters
        return str.charAt(0) + chrToLast(newString, ch);
    }
}

如果您执行以下操作:
chrToLast("Hello, World!", 'l')

这将产生所需的结果:Heo, Word! lll 过程 通常情况下,这种方法是通过检查给定字符串中当前第一个字符来确定要做什么的。如果第一个字符与您要寻找的字符相同(l),则会从字符串中删除该字符并对新字符串使用chrToLast。但是,它还通过使用+ ch将找到的字符添加到结果的末尾。它继续执行此操作直到没有更多字符为止,这就是结束条件结束条件 结束条件返回空字符串"",因为它是算法的基本情况。您可以将递归算法视为调用自身解决问题的东西。通过调用自身,递归算法向基数移动。在这个特定的例子中,它通过每次执行方法时减去一个字符来实现。一旦没有字符了,它就达到了基本情况,即"",其中字符串最终为空,无法再减去任何字符。(因此它作为最终状态而不返回任何值)
希望这回答了您的问题。理解这个概念很重要,因为它非常强大。尝试研究代码,如果有不清楚的地方,请发表评论。
还有一种可以帮助您的方法是在IDE中执行此代码并使用调试器来浏览其执行。然后您可以自己看到程序的流程,并查看所涉及变量的值。

为什么在结尾条件下它会返回空字符串? - Escaban
它这样做是因为没有字符可以返回了。它执行函数多次,每次都会删除字符串的第一个字符:Hello World! -> ello World! -> 等等。一旦字符串为空,它就需要停止。所以,它不再继续执行,而是立即返回一个空字符串。 - NocNit
更新了我的答案,添加了关于结束条件的信息。 - NocNit

0

如果您使用递归,那么对于您期望的结果来说,调用将非常昂贵。无论您如何操作,都会涉及到大量字符串或charArray元素的移动。我认为这不是一个明智的选择。我会这样做,它的空间复杂度为O(2n),性能复杂度为O(n)。

public class Solve {
public static void main(String[] args) {
    System.out.println(ChToLast("Hello world!", 'l'));
}

public static String ChToLast(String str, char ch) {
    char[] chars = str.toCharArray();
    char[] modChars = new char[chars.length];
    int i = 0;      
    for(char element : chars){
        if(ch != element){
            modChars[i++] = element;
        }
    }
    Arrays.fill(modChars, i, chars.length , ch);
    return new String(modChars);
}   
}

0
如果您使用while循环并编写一个方法来检查该字符串是否是完美语句,那么这可能适合您。在这里,您需要一些自然语言处理(NLP)概念的帮助,以便每次检查排列的字符是否构成任何语句或语法上正确。这将有所帮助。

我是新手,我会对NLP概念进行一些研究,谢谢。 - Escaban

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接