描述 输入一个长度为 n 由大小写字母组成的字符串,打印出该字符串中字符的所有排列,例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。 注意字符需要按字典序排序,结果里面也不要出现重复的数据。 数据范围:字符串的长度不超过10 要求:空间复杂度 O(n!)O(n!),时间复杂度 O(n!)O(n!) 输入描述 输入一个字符串,长度不超过10,字符只包括大小写字母。 输出描述 请输出输入字符串的字符所能排列出来的所有字符串。 注意字符需要按字典序排序,结果里面也不要出现重复的数据。请写出C代码
时间: 2024-02-18 09:00:09 浏览: 90
好的,下面是C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 10
int vis[MAX_N]; // 用于去重
char str[MAX_N]; // 输入字符串
char path[MAX_N]; // 保存当前排列
int len; // 输入字符串的长度
// 回溯函数
void dfs(int depth) {
if (depth == len) { // 找到一个排列
printf("%s\n", path);
return;
}
// 枚举可用的字符
for (int i = 0; i < len; i++) {
if (!vis[i]) { // 如果该字符还没有被使用
// 去重处理
if (i > 0 && str[i] == str[i-1] && !vis[i-1]) {
continue;
}
vis[i] = 1; // 标记该字符已被使用
path[depth] = str[i]; // 将该字符加入当前排列中
dfs(depth+1); // 继续处理下一个字符
vis[i] = 0; // 回溯,将该字符标记为未使用
}
}
}
int cmp(const void *a, const void *b) {
return *(char *)a - *(char *)b;
}
int main() {
scanf("%s", str);
len = strlen(str);
// 对输入字符串按字典序排序
qsort(str, len, sizeof(char), cmp);
dfs(0);
return 0;
}
```
运行结果:
输入:ABC
输出:
ABC
ACB
BAC
BCA
CAB
CBA
阅读全文