当前位置: 首页 > 知识库问答 >
问题:

Java中使用递归的字符串置换

宇文和同
2023-03-14

我看到了这篇文章,它非常努力地解释了打印所有字符串的递归解决方案。

public class Main {
    private static void permutation(String prefix, String str) {
        int n = str.length();
        if (n == 0)
            System.out.println(prefix);
        else {
            for (int i = 0; i < n; i++)
                permutation(prefix + str.charAt(i),
                        str.substring(0, i) + str.substring(i + 1));
        }
    }

    public static void main(String[] args) {
        permutation("", "ABCD");
    }
}

但当我们开始弹出堆栈时,我仍然无法得到部分。例如,递归一直进行到置换(“abcd”,“”),在这里,基大小写遇到,它打印abcd。但现在发生了什么?我们从函数调用堆栈弹出置换(“abc”,“d”)。我们用这个做什么等等?

谁能帮我解释一下吗?

另外,我需要一些关于时间复杂度的指示。不像完全的计算而是一些暗示。

共有1个答案

宋勇
2023-03-14

更简单的示例:置换(“”,“abc”),将空字符串表示为*:

* ABC + A BC + AB C - ABC *
      |      |
      |      ` AC B - ACB *
      |
      + B AC + BA C - BAC *
      |      |
      |      ` BC A - BCA *
      |
      ` C AB + CA B - CAB *
             |
             ` CB A - CBA *

注意,这看起来像是一棵侧卧的树。的确,它叫一棵树。开始时,我们会进入(“A”,“BC”)状态;我们继续调用(“ab”,“c”),最后调用(“abc”,“”)。这里我们打印输出。然后我们记得我们有未完成的业务,我们返回到一个循环,但上一个级别的循环只有一个循环。所以我们也完成了,返回到(“A”,“BC”)级别;在“bc”中有两个元素,我们只做了“b”,所以现在轮到“c”了:我们调用(“ac”,“b”),后者再调用(“acb”,“”)。现在(“a”,“bc”)下的所有循环都完成了...但是等等,还有工作要做!因为(“”,“abc”)还有两个字母要处理。就这样,在我们通常所说的“深度优先搜索”中,一个分支一个分支地进行。

每一层都有一个循环。循环收缩(我们在左边的粗分支中迭代3次,然后在下一个级别中迭代2次,然后只有一次),但仍然有一个循环。因此,我们总共进行n*(n-1)*(n-2)*...*2*1迭代。O(n!)

 类似资料:
  • 问题内容: 我正在尝试查找字符串中字母的首次出现。例如,苹果中的p应该返回1。这是我拥有的: 它似乎似乎没有返回正确的值。 问题答案: 您的尝试很好,但是还不够。这是基于您的正确实现: 您的尝试存在两个问题: 在这一部分中,您已经找到了角色,因此正确的做法是停止递归,但您仍在继续。 在最后一个return语句中,您需要在递归调用中加1(如果最终找到了该字符),作为累加总索引号的一种方式。

  • 我试图编写一个方法,使用递归打印字符串的所有排列。现在,我有这样的代码: 它打印出正确的结果,但我试图在不使用循环的情况下解决它,包括第4行中的循环。可能吗?如果是这样,你会如何解决?非常感谢。 我试图添加第三个名为index的参数,并在第5行的递归调用中写入index 1,但没有成功。我认为添加第三个参数是个好主意,我只是不知道如何使用它。

  • 我是Python的超级新手,并试图创建一个非常简单的函数,用于更大的地图着色程序。 该函数的思想是将一组变量归于不同的区域(string1),并将颜色分配给它们(r、g、b),然后通过递归地查看一组区域边界(string2)来测试这些区域是否接触到相同颜色的另一个区域,以找到匹配的变量颜色。 输入格式如下:("Ar, Bg, Cb","AB, CB, CA")将返回True,这意味着没有相同颜色的

  • 我试图使用这个递归函数来找到回文字符串,但是代码输出术语<code>alia

  • 本文向大家介绍java递归法求字符串逆序,包括了java递归法求字符串逆序的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java递归法求字符串逆序的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的java程序设计有所帮助。

  • 我需要解码一个递归编码为count后跟substring的字符串 给定一个编码字符串,任务是对其进行解码。字符串的编码模式如下所示。 示例: 输入:str[]=“1[b]”输出:b 输入:str[]="2[ab]输出:abab 输入:str[]=“2[a2[b]”输出:ABB 输入:str[]="3[b2[ca]]"输出:bcacabcacabcaca 下面是我试图实现的代码。我只知道它可以用两个