📌  相关文章
📜  C程序打印给定字符串的所有排列(1)

📅  最后修改于: 2023-12-03 14:40:26.772000             🧑  作者: Mango

C程序打印给定字符串的所有排列

本程序旨在将给定字符串的所有排列打印出来。例如,如果输入字符串为"abc",则程序将打印"abc"、"acb"、"bac"、"bca"、"cab"、"cba"这6种排列。

程序的思路是采用递归的方式,不断交换字符串中的字符。

算法流程
  1. 将字符串分为两部分:第一个字符和其余部分;
  2. 固定第一个字符,将余下部分进行递归调用;
  3. 递归返回到上一级时,将第一个字符与后面的字符交换,重复进行第二步和第三步;
  4. 当字符串长度为1时,表示已经排列完成,输出字符串即可。
代码实现
#include <stdio.h>
#include <string.h>

void swap(char *a, char *b)
{
    char temp = *a;
    *a = *b;
    *b = temp;
}

void permutation(char *str, int start, int end)
{
    // 字符串长度为1,输出排列结果
    if (start == end) {
        printf("%s\n", str);
        return;
    }

    int i;
    for (i = start; i <= end; i++) {
        // 交换第一个字符与后面的字符
        swap(str + i, str + start);
        // 对余下的字符进行递归调用
        permutation(str, start + 1, end);
        // 恢复交换的字符
        swap(str + i, str + start);
    }
}

int main()
{
    char str[50];

    printf("请输入字符串:");
    scanf("%s", str);

    // 调用函数打印排列结果
    permutation(str, 0, strlen(str) - 1);

    return 0;
}
代码说明
swap函数

该函数用于交换两个字符的位置。在该算法中,用于交换第一个字符与后面的字符。

permutation函数

该函数为递归函数,用于进行排列操作。

  • str:需要被操作的字符串;
  • start:字符串的起始位置;
  • end:字符串的结束位置。
主函数

主函数用于输入字符串并调用permutation函数打印排列结果。

总结

本算法采用递归实现,通过交换字符的位置来进行排列操作,时间复杂度为O(n!)。