题目:无重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同。
示例1:
输入:S = "qwe"
输出:["qwe", "qew", "wqe", "weq", "ewq", "eqw"]
字符都是英文字母。
字符串长度在[1, 9]之间。
解题思路:深度优先+贪心。每一层用for循环对已有字符串逐个位置插入新字符,构造全部可能组合
源码:
char **list;
int cnt;
void proc(char *old, int len, char *add)
{
if (*add == 0) {
// printf("record: %s\n", old);
list[cnt] = malloc(len + 1);
strcpy(list[cnt++], old);
return;
}
char *new = malloc(len + 2);//这里对内存耗费比较大,直接基于old添加和剔除新字符,应该也可以。
for (int i = 0; i < len + 1; i++) {
memcpy(new, old, i);
new[i] = *add;
memcpy(new + i + 1, old + i, len - i + 1);
proc(new, len + 1, add + 1);
}
free(new);
}
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
char **permutation(char *S, int *returnSize)
{
if (!S || !strlen(S))
return *returnSize = 0;
cnt = 0;
list = malloc(8 * 370000);
char t[10] = { S[0] };
proc(t, 1, S + 1);
*returnSize = cnt;
return list;
}