小编典典

在C中打印字符串的所有排列

algorithm

我正在学习回溯和递归,并且我陷入了一种打印字符串的所有排列的算法。我使用了贝尔算法进行置换来解决它,但是我无法理解递归方法。我在网上搜索并找到以下代码:

void permute(char *a, int i, int n) 
{
   int j; 
   if (i == n)
     printf("%s\n", a);
   else
   {
        for (j = i; j <= n; j++)
       {
          swap((a+i), (a+j));
          permute(a, i+1, n);
          swap((a+i), (a+j)); 
       }
   }
}

我无法理解该算法的基本工作原理?我什至尝试空运行!

回溯如何应用?

它比Bell算法更有效地计算置换吗?


阅读 229

收藏
2020-07-28

共1个答案

小编典典

该算法基本上适用于以下逻辑:

字符串X的所有排列与X中每个可能字符的所有排列都是相同的,再加上字符串X中没有该字母的所有排列。

也就是说,“ abcd”的所有排列都是

  • “ a”与“ bcd”的所有排列组合
  • “ b”与“ acd”的所有排列组合
  • “ c”与所有“坏”的排列组合在一起
  • “ d”与“ bca”的所有排列串联

特别是,此算法不是对子字符串执行递归,而是在输入字符串上执行递归,而不会占用额外的内存来分配子字符串。“回溯”撤消对字符串的更改,使其保持原始状态。

2020-07-28