LCR 157. 套餐内商品的排列顺序
某店铺将用于组成套餐的商品记作字符串 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;}