题目:
输入一个字符串,打印出该字符串中字符的所有排列。
思路:
把字符串分为两部分,一部分是字符串的第一个字符,第二部分是第一个字符串的后面那一部分。第一部分就是要求出出现在第一个位置的所有可能性。实际上这就是第一个位置的字符与后面的进行交换。后面部分的操作和第一个位置的是一样的,所以这个题就是经典的递归算法。
代码实现:
bool judgeRepeat(char *s, int start, int end) {
for (int i = start; i < end; i++){
if (s[i] == s[end])
{
return true;
}
}
return false;
}
void swap(char* s, int i, int j){
char tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
void dfs(char* s, int head, int length, char** res, int* returnSize){
if (head == length - 1)
{
// 对temps 进行copy 一份
char *temp = (char *)malloc(sizeof(char) * (length + 1));
strcpy(temp, s);
res[(*returnSize)++] = temp;
}
for (int i = head; i < length; i++)
{
if (judgeRepeat(s, head, i))
{
continue;
}
swap(s, head, i); // 放到开头
dfs(s, head + 1, length, res, returnSize); // 对剩下的再次进行递归
swap(s, i, head);// 进行还原
}
}
char** permutation(char* s, int* returnSize){
int length = strlen(s);
*returnSize = 0;
if (s == NULL)
{
return NULL;
}
int baseSize = 1;
for (int i = 1; i <= length; i++)
{
baseSize = baseSize * i;
}
char** res = (char **)malloc(sizeof(char *) * (baseSize + 1));
// 递归入口
dfs(s, 0, length, res, returnSize);
return res;
}