`
airu
  • 浏览: 267508 次
  • 性别: Icon_minigender_1
  • 来自: 云南
社区版块
存档分类
最新评论

全排列递归思路(c)版本

 
阅读更多

附上 c 版本

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAX 10

char * subElement(char *input,int pos);
void permutation(char *input,int len, int pos, char *p);

char *subElement(char *input, int pos)
{
    int i = 0;
    char *ret = (char*)malloc(MAX*sizeof(char));
    char *tmp = ret;
    while( input != NULL && i < MAX )
    {
        if(i != pos)
        {
            *tmp = *input;
            tmp++;
        }
        input++;
        i++;
    }
    tmp[i] = '\0';
    return ret;
}
void permutation(char *input, int len, int pos, char *p)
{
    int i = 0;

    if(len == 0)
    {
        return;
    }
    //only one element
    if(len == 1)
    {
            printf("{%s}\n",input);
            return;
    }

    char *lp = (char *)malloc(sizeof(char)*MAX);
    memset(lp,'\0',sizeof(char)*MAX);

    char *sp = subElement(input, pos);
    int plen = 0;
    if(p != NULL)
    {
        plen = strlen(p);
        strcpy(lp,p);
    }

    lp[plen] = input[pos];
    lp[plen+1] = '\0';

    int slen = strlen(sp);
    if(slen == 1)
    {
        lp[plen+1] = *sp;
        printf("{%s}\n",lp);
        return;
    }

    for(i = 0; i < slen; i++)
    {
        permutation(sp,len-1,i,lp);
    }
    free(sp);
    free(lp);
}
void main()
{
    int i = 0;
    char instr[MAX];
    printf("write elements:");
    scanf("%s",instr);
    char *parent = NULL;
    for(i = 0; i < strlen(instr); i++)
    {
        permutation(instr,strlen(instr), i, parent);
    }
}

 

关于这类问题的一个数学解释,很强大。

http://episte.math.ntu.edu.tw/articles/mm/mm_10_2_04/index.html

留下链接慢慢学习。

分享到:
评论

相关推荐

    使用C语言解决字符串全排列问题

    例如输入字符串abc,则输出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba 思路 这是典型的递归求解问题,递归算法有四个特性: 必须有可达到的终止条件,否则程序陷入死循环 子问题在规模上...

    算法实践:全排列(递归)

    全排列 描述 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 输入 输入只有一行,是一个由不同的小写字母组成的字符串,已知字符...bca cab cba 难度 中等,递归 解题思路 代码 status_list =

    PHP实现字符串的全排列详解

    例如,输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 思路: 1.利用递归形成递归树,达到深度优先,固定首字母的效果 2.得复位以后才能再次深度优先 3.回溯法思想 4.一张图和...

    C语言实现全排列算法模板的方法

    可见这是一个递归的过程,把对整个序列做全排列的问题归结为对它的子序列做全排列的问题,注意我没有描述Base Case怎么处理,你需要自己想。你的程序要具有通用性,如果改变了N和数组a的定义(比如改成4个数的数组)...

    深入全排列算法及其实现方法

    全排列在很多程序都有应用,是一个很常见的算法,常规的算法是一种递归的算法,这种算法的得到基于以下的分析思路。 给定一个具有n个元素的集合(n&gt;=1),要求输出这个集合中元素的所有可能的排列。一、递归实现...

    fullarray.c

    该算法实现全排列的思路是:设一列相邻且从小到大排列的数为a1,a2......an,从an-1向前倒推,依次比较该数与其后面数ak的大小,如果该数大,则将该数与ak交换位置,将ak后面的数重新从小到大排列,然后输出整个数列...

    leetcode 46. Permutations 迭代+递归 python3

    一.问题描述 ...1,数组长度为n,后面i~n的子数组已完成全排列,我们慢慢向前推进,接下来把nums[i-1]加进去,来完成新子数组的全排列,方法就是把nums[i-1]插入i~n子数组所有全排列的结果中的每个可能

    cfcc-main.zip

    14.c //递归汉诺 15.c //选择法排序 16.c //局部变量的生存期 17.c //全局变量的作用域 18.c //神奇的 i++ 19.c //预编译处理 20.c //神奇的指针 xiao.txt //刷题思路 xiao2 21.c //数组指针 22.c //出题验证系统 23...

    程序员面试攻略 part1(共2个)

    第2章程序设计面试题的解答思路9 2.1 面试过程9 2.2 关于面试题11 2.3 答题方法11 2.4 遇到疑难时13 2.5 对解决方案进行分析15 第3章链表19 3.1 单向链表19 3.1.1 头指针的修改20 3.1.2 遍历21 3.1.3 ...

    程序员面试攻略part 2(共2个)

    第2章程序设计面试题的解答思路9 2.1 面试过程9 2.2 关于面试题11 2.3 答题方法11 2.4 遇到疑难时13 2.5 对解决方案进行分析15 第3章链表19 3.1 单向链表19 3.1.1 头指针的修改20 3.1.2 遍历21 3.1.3 ...

Global site tag (gtag.js) - Google Analytics