设为首页 加入收藏

TOP

全排列算法之Perm算法实现(一)
2014-04-06 17:34:29 来源: 作者: 【 】 浏览:173
Tags:排列 算法 Perm 实现

  题目描述:

  给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。

  我们假设对于小写字母有'a' < 'b' < … < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列。

  输入:

  输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。

  输出:

  输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:

  已知S = s1s2…sk , T = t1t2…tk,则S < T 等价于,存在p (1 <= p <= k),使得

  s1 = t1, s2 = t2, …, sp - 1 = tp - 1, sp < tp成立。

  样例输入:

  abc

  样例输出:

  abc

  acb

  bac

  bca

  cab

  cba

  提示:

  每组样例输出结束后要再输出一个回车。

  想必大家对perm递归算法求全排列并不陌生,但我贴出来的题目却不能用perm算法来解决,为什么呢?请容我慢慢道来,首先题目对全排列有着非常严格的顺序要求,即按字典顺序排列,就是这个perm算法是满足不了的(或许经过小小的改变是可以实现的,我们在这里就不讨论了)。那么下来我来谈谈perm算法的核心思:举个例子,比如要你1的全排列,你肯定会说那还不简单啊,那么接下来加深难度求1,2的全排列,其实也不难,现在让你求1,2,3,4,5的全排列呢,还转得过来吗?现在我们可以这样想,3,4,5的全排列是以3开头的4,5的全排列组合和4开头的3,5的全排列组合以及以5开头的3,4全排列组合。这就是perm算法的核心思想,列出一个通俗一点的式子:

  从而可以推断,设一组数p = {r1, r2, r3, … ,rn}, 全排列为perm(p),pn = p - {rn}.

  因此perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), … , rnperm(pn)。

  当n = 1时perm(p} = r1.

  下面贴出代码:

  #include<CSTDIO>

  #include<CSTRING>

  #define MAX 10

  using namespace std;

  void swap(char str[],int i,int j)

  {

  int temp;

  temp=str[i];

  str[i]=str[j];

  str[j]=temp;

  }

  void perm(char str[],int k,int m)

  {

  int i;

  if(k>m)

  {

  for(i=0;i<=m;i++)

  printf("%c",str[i]);

  printf("\n");

  }

  else

  {

  for(i=k;i<=m;i++)

  {

  swap(str,k,i);

  perm(str,k+1,m);

  swap(str,k,i);

  }

  }

  }

  int main(int argc,char *argv[])

  {

  char str[MAX];

  while(scanf("%s",str)!=EOF)

  {

  int len=strlen(str);

  perm(str,0,len-1);

  printf("\n");

  }

  return 0;

  }

  这里会出现两个问题,其一是超时,其二是答案顺序不对…

   

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇windows下的C++ socket服务器 下一篇VC++中关于TCHAR等的解释

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·HTTPS 详解一:附带 (2025-12-26 02:20:37)
·TCP/IP协议到底在讲 (2025-12-26 02:20:34)
·TCP和UDP在socket编 (2025-12-26 02:20:32)
·有没有适合新手练习 (2025-12-26 01:48:47)
·用清华镜像网怎么下 (2025-12-26 01:48:44)