输入一条英文字符串,先通过程序去除字符串中重复字母并按字典序排列,然后通过递归程序调用形式实现这些字母的所有排列顺序显示。c语言怎么写
时间: 2024-12-10 14:51:32 浏览: 15
基于C实现的按照字典序生成排列的算法(字典序)
在C语言中,你可以使用标准库函数以及递归算法来实现这个需求。首先,你需要一个函数来去重并排序字符数组,然后另一个函数来生成所有可能的排列。以下是简单的步骤和代码示例:
1. **去重并排序**:
```c
#include <stdio.h>
#include <string.h>
void remove_duplicates(char* str) {
int i, j;
for (i = 0; i < strlen(str); i++) {
for (j = i + 1; j < strlen(str); j++) {
if (str[i] == str[j]) {
// 将重复的字符替换为空格以便后续处理
str[j] = ' ';
}
}
}
// 移除空格并将剩余的字符排序
char temp[strlen(str)];
strcpy(temp, str);
sort(temp);
str = temp;
// 删除连续的空格,并去掉多余的空格
int k = 0;
for (i = 0; str[i]; i++) {
if (str[i] != ' ') {
str[k++] = str[i];
}
}
str[k] = '\0';
}
void sort(char* arr) {
/* 使用标准库中的qsort进行排序 */
qsort(arr, strlen(arr), sizeof(char), strcmp);
}
```
2. **生成所有排列**:
```c
#include <stdio.h>
#include <stdlib.h>
// 用于存储当前排列的栈
#define MAX_PERM 10
char perm[MAX_PERM][26];
void permute(char* str, int start, int end) {
if (start == end) {
printf("%s\n", str);
} else {
for (int i = start; i <= end; i++) {
// 交换当前位置和起始位置的字符
char temp = str[start];
str[start] = str[i];
str[i] = temp;
// 递归生成剩余部分的排列
permute(str, start+1, end);
// 回溯:恢复原始顺序
temp = str[start];
str[start] = str[i];
str[i] = temp;
}
}
}
int main() {
char input[100];
printf("Enter a string without spaces: ");
fgets(input, sizeof(input), stdin);
input[strcspn(input, "\n")] = '\0'; // 移除fgets留下的换行符
remove_duplicates(input); // 去重并排序
permute(input, 0, strlen(input)-1);
return 0;
}
```
阅读全文