📅  最后修改于: 2023-12-03 15:13:46.801000             🧑  作者: Mango
给定一个字符串,编写一个函数,以打印出所有字符的所有排列。你可以假设输入字符串的长度不超过9个字符。
这是一道回溯问题。我们可以把字符串的所有字符看作一个个的节点,从根节点开始,往下依次遍历,遍历过程中需要剪枝。当遍历到叶子节点时,说明找到了合法的一组解。
具体实现步骤如下:
具体代码实现请参考以下示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap(char* a, char* b)
{
char temp = *a;
*a = *b;
*b = temp;
}
void dfs(char* str, char* path, int* visited, int depth, int len)
{
if (depth == len) {
printf("%s\n", path);
return;
}
for (int i = 0; i < len; ++i) {
if (!visited[i]) {
if (i > 0 && str[i] == str[i - 1] && visited[i - 1] == 0) {
continue;
}
visited[i] = 1;
path[depth] = str[i];
dfs(str, path, visited, depth + 1, len);
visited[i] = 0;
}
}
}
void permutation(char* str)
{
if (str == NULL) {
return;
}
int len = strlen(str);
if (len == 0) {
return;
}
char path[len + 1];
int visited[len];
memset(visited, 0, sizeof(visited));
memset(path, 0, sizeof(path));
path[len] = '\0';
// 将字符串排序
qsort(str, len, sizeof(char), strcmp);
dfs(str, path, visited, 0, len);
}
int main(int argc, char const *argv[])
{
char str[] = "abc";
permutation(str);
return 0;
}
回溯算法是一种常用的算法,可以解决很多搜索问题。本题是回溯算法的典型应用,通过简单的代码实现,可以轻松解决字符串排列问题。