【问题标题】:String permutation - How does this backtracking recursion work?字符串排列 - 这种回溯递归是如何工作的?
【发布时间】:2015-10-26 23:01:58
【问题描述】:

这个函数基本上通过将一个字符与它的所有其他字符交换来打印字符串的所有可能排列。我理解交换和置换的前两个调用。但是为什么第二次调用 swap 呢?我无法理解这段代码。有人可以解释一下这是如何工作的吗?

/* Function to print permutations of string
   This function takes three parameters:
   1. String
   2. Starting index of the string
   3. Ending index of the string. */
void permute(char *a, int l, int r)
{
   int i;
   if (l == r)
     printf("%s\n", a);
   else
   {
       for (i = l; i <= r; i++)
       {
          swap((a+l), (a+i));
          permute(a, l+1, r);
          swap((a+l), (a+i)); //backtrack
       }
   }
}

【问题讨论】:

    标签: c string recursion


    【解决方案1】:

    “回溯”将字符串交换回其原始状态,这对于算法的正确运行至关重要。

    您不希望您的函数弄乱您的输入字符串,对吗?

    【讨论】:

    • 不仅可以保留输入,还可以避免重复和其他奇怪的行为。我们要确保保持原样,以便之前的调用可以在同一个位置找到字符。
    • @FilipeGonçalves:非常正确,在二读时,我暗示这只是一个“礼仪”电话,当然不是。
    猜你喜欢
    • 2021-11-16
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    相关资源
    最近更新 更多