字符串的排列按升序排列

时间:2015-04-18 06:19:19

标签: c++ c permutation

编写程序以形成字符串的排列,方法如下: 输入:ABCD
输出:

A
AB
AC
AD
ABC
ACD
ABCD
B
BC
BD
BCD
C
CD
D

但我尝试在c语言中使用反向跟踪算法:

#include <stdio.h>

/* Function to swap values at two pointers */
void swap(char *x, char *y)
{
    char temp;
    temp = *x;
    *x = *y;
    *y = temp;
}

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)); //backtrack
        }
    }
}

int main()
{
    char a[] = "ABC";
    permute(a, 0, 2);
    getchar();
    return 0;
}

输入:ABC

输出:

ABC
ACB
BAC
BCA
CBA
CAB

但是我需要一个只有指定顺序的程序,比如

A
AB
AC
ABC
B
BC
C

1 个答案:

答案 0 :(得分:2)

在你的例子中,字符串不是按升序排列的:你有AB,AC,AD,ABC,......,但是你有C,BC之前的B和D.如果你想按字母顺序排列它应该是A,AB,ABC,ABCD,AC,......

当你以这种方式编写它时,你会看到递归结构...只需从列表的前半部分取A,你应该得到第二个。因此,您可以轻松编写一个类似

的递归程序
permute("ABCD"):
  print ("A" + everything in permute("BCD"))
  print (everything in permute("BCD"))