力扣 47 全排列 II,
花了些时间重新学习了暴力枚举法,直接上代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
/* 函 数 名: FullPermutation
* 函数功能: 包含重复字符的排列
* date author reason
* 2019.09.27 zhendongzd@163.com create
*/
void FullPermutation(int step, int nums, char dataIn[], bool occupyFlag[], char dataOut[])
{
int i;
if (step == nums) {
for (i = 0; i < nums; i++) {
printf("%c ", dataOut[i]);
}
printf("\n");
return;
}
for (i = 0; i < nums; i++) {
if (occupyFlag[i] != true) {
if ((i != 0) && (dataIn[i] == dataIn[i - 1]) && (occupyFlag[i - 1] != true)) {
break;
} else {
occupyFlag[i] = true;
dataOut[step] = dataIn[i];
FullPermutation(step + 1, nums, dataIn, occupyFlag, dataOut);
occupyFlag[i] = false;
}
}
}
}
int Cmpfunc(const void *a, const void *b)
{
return ((*(char *)a) - (*(char *)b));
}
int main()
{
int step = 0;
char dataIn[] = "abbd";
int nums = strlen(dataIn);
int bufferSize = nums + 1;
bool *captueFlag = (bool *)calloc(bufferSize, sizeof(bool));
char *dataOut = (char *)malloc(bufferSize * sizeof(char));
qsort(dataIn, nums, sizeof(char), Cmpfunc);
FullPermutation(step, nums, dataIn, captueFlag, dataOut);
system("pause");
return 0;
}