1

下面给出的代码打印给定字符串的所有可能组合。它递归地产生字符串。现在我想使用指向每个字符串的指针数组将每个组合存储在一个数组中。我如何初始化指针以使其指向字符串。代码是: -

Input ABC
Output 

ABC in b[0]
ACB in b[1]
BAC 
BCA
CAB 
CBA 

等等 。

谢谢 :)

void permute(char *a, int i, int n) 
{
  int k=0;
  char *b[100];
   int j;
   if (i == n)
     {
      // *b[k]=a;
     printf("%s\n", a);
      i++;
     }
   else
   {
        for (j = i; j <= n; j++)
       {
          swap((a+i), (a+j));
          permute(a, i+1, n);
          swap((a+i), (a+j)); //backtrack
       }
   }
} 
4

2 回答 2

0

指向 to 的元素是没有意义的ba因为它是a可变字符串(也就是说,它一直在变化)。此类代码的可能输出是 的所有元素都是b字符串的最后一个排列a

每次找到新排列时,都需要动态分配字符串。您可以使用malloc(). 或者可以用来strdup()为你创建重复的字符串(记住在free()课程的最后)。

/*Sample Code*/

if (i == n)
{
  b[k] = strdup(a);
  ...
}

请记住,您还需要将k作为参数传递给函数permute(),因为k它是一个自动变量,使用 value = 新创建0,每次permute()调用函数时。还有其他可能性,品牌k globalstatic变量。

于 2013-09-14T07:58:14.703 回答
0

您可以动态分配一个数组,该数组将保存代表每个排列的单个 char 数组(或 C 字符串)。使此代码通用的一件事是在 main() 中为给定字符串找到 total_permutations 的值 strlen N,实际上是阶乘 (N)。这里:

void swap(char* A, char* B) {
    char t;
    t = *A;
    *A = *B;
    *B = t;
}

int permute(char **arr_of_chars, int count, char *a, int i, int n)
{
    int k=0;
    char *b[100];
    int j;
    if (i == n) {
        // *b[k]=a;
        printf("%s\n", a);
        memcpy(arr_of_chars[count], a, strlen(a));
        count++;
        i++;
    } else {
        for (j = i; j <= n; j++) {
        swap((a+i), (a+j));
        count = permute(arr_of_chars, count, a, i+1, n);
        swap((a+i), (a+j)); //backtrack
        }
    }
    return count;
}

int main() {
    char str[] = "";
    char **arr_of_str = NULL;
    int len_str = strlen(str);
    int i = len_str;
    int total_permutations = 1;

    while (i > 0) { /* Get all the combinations */
        total_permutations *= i;
        i--;
    }

    arr_of_str = (char **) malloc(total_permutations * sizeof(char*));
    for (i=0; i <total_permutations; i++) {
        arr_of_str[i] = (char *) malloc(sizeof(char) * len_str);
    }

    permute(arr_of_str, 0, str, 0, (len_str-1));

    for (i=0; i <total_permutations; i++) {
        printf("%s \n", arr_of_str[i]);
        free(arr_of_str[i]);
    }
    free(arr_of_str);
}
于 2013-09-14T08:08:39.910 回答