面试题 08.07. 无重复字符串的排列组合
无重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同。
示例1:
输入:S = “qwe”
输出:[“qwe”, “qew”, “wqe”, “weq”, “ewq”, “eqw”]
示例2:
输入:S = “ab”
输出:[“ab”, “ba”]
解题代码人如下,可能代码看似复杂,多练习就好啦
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int size;
void dfs(int nowlen,int len,char **re,char *s,char *t,int *r){
int i=0;
if(nowlen==len){
re[size]=(char *)malloc(sizeof(char)*(len+1));
for(i=0;i<len;i++){
re[size][i]=t[i];
}
re[size][i]='\0';
size++;
}
else{
for(i=0;i<len;i++){
if(r[i]==1){
t[nowlen]=s[i];
r[i]=0;
dfs(nowlen+1,len,re,s,t,r);
r[i]=1;
}
}
}
}
int f(int n){
int re=1;
while(n>=1){
re=re*n;
n--;
}
return re;
}
char** permutation(char* S, int* returnSize){
int len=strlen(S);
char **re=(char **)malloc(sizeof(char *)*f(len));
char* t=(char *)malloc(sizeof(char)*len);
int *r=(int *)malloc(sizeof(int)*len);
int i=0;
for(i=0;i<len;i++){
r[i]=1;
}
size=0;
for(i=0;i<len;i++){
if(r[i]==1){
t[0]=S[i];
r[i]=0;
dfs(1,len,re,S,t,r);
r[i]=1;
}
}
* returnSize=size;
return re;
}