某店铺将用于组成套餐的商品记作字符串 goods,其中 goods[i] 表示对应商品。请返回该套餐内所含商品的 全部排列方式 。
返回结果 无顺序要求,但不能含有重复的元素。
示例 1:
输入:goods = “agew”
输出:[“aegw”,“aewg”,“agew”,“agwe”,“aweg”,“awge”,“eagw”,“eawg”,“egaw”,“egwa”,“ewag”,“ewga”,“gaew”,“gawe”,“geaw”,“gewa”,“gwae”,“gwea”,“waeg”,“wage”,“weag”,“wega”,“wgae”,“wgea”]
这样的题目就是使用深度优先遍历就可以啦,解题代码如下:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
bool judge(char *s,int nowsize,char ch){
if(nowsize==0){
return true;
}
else{
for(int i=0;i<nowsize;i++){
if(s[i]==ch){
return false;
}
}
return true;
}
}
int size;
void dfs(char *re,char* goods, int nowsize,int sl,char **ret,int *r){
char a[sl];
int p=0;
if(nowsize==sl){
re[nowsize]='\0';
// printf("%s ",re);
strcpy(ret[size],re);
size++;
}
else{
for(int i=0;goods[i]!='\0';i++){
int flag=0;
for(int j=0;j<p;j++){
if(goods[i]==a[j]){
flag=1;
break;
}
}
if(flag==1){
continue;
}
if(r[i]==0){
a[p++]=goods[i];
re[nowsize]=goods[i];
r[i]=1;
dfs(re,goods, nowsize+1,sl,ret,r);
r[i]=0;
}
}
}
}
char** goodsOrder(char* goods, int* returnSize) {
int sl=strlen(goods);
int count=1;
int *r=(int *)malloc(sizeof(int)*sl);
size=0;
for(int i=1;i<=sl;i++){
count=count*i;
r[i-1]=0;
}
char *re=(char *)malloc(sizeof(char)*(sl+1));
char **ret=(char **)malloc(sizeof(char*)*(count));
for(int i=0;i<count;i++){
ret[i]=(char *)malloc(sizeof(char )*(sl+1));
}
dfs(re,goods, 0,sl,ret,r);
*returnSize=size;
return ret;
}