分享免费的编程资源和教程

网站首页 > 技术教程 正文

C语言 字符串全排列 递归 & 非递归

goqiw 2024-09-20 22:54:46 技术教程 66 ℃ 0 评论

talk is cheap,show me the code.

运行结果:

代码如下:

// C语言 字符串全排列 递归 & 非递归
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 交换两个字符
void swap(char *x, char *y) {
    char temp = *x;
    *x = *y;
    *y = temp;
}

// 递归函数生成全排列
void permute(char *str, int l, int r) {
    int i;
    if (l == r) {
        puts(str);
    }
    else {
        for (i = l; i <= r; i++) {
            swap((str + l), (str + i));
            permute(str, l + 1, r);
            swap((str + l), (str + i)); // 还原字符串,为了下次循环交换不同的字符位置
        }
    }
}

// 非递归方式生成全排列
void permute2(char *str, int n) {
    int i, j, k;
    int* c = (int*)malloc(n * sizeof(int));
    for (i = 0; i < n; i++) {
        c[i] = 0;
    }
    puts(str);
    i = 0;
    while (i < n) {
        if (c[i] < i) {
            if (i % 2 == 0)
                swap(&str[0], &str[i]);
            else
                swap(&str[c[i]], &str[i]);
            printf("%s\n", str);
            c[i]++;
            i = 0;
        } else {
            c[i] = 0;
            i++;
        }
    }
    free(c);
}

int main() {
    char str[100] = "12345789abcdefg";
    int n = strlen(str);
    puts("全排列 递归算法输出:");
    permute(str, 0, n - 1);
		puts("\n全排列 非递归算法输出:");
		permute2(str,n);
    return 0;
}

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表