设为首页 加入收藏

TOP

逐个追加组合算法(一)
2013-09-26 19:52:34 来源: 作者: 【 】 浏览:325
Tags:逐个 追加 组合 算法

  算法题:用你熟悉的编程(www.cppentry.com)语言,设计如下功能的函数:

  输入一个字符串,输出该字符串中所有字母的全排列。程序请适当添加注释。

  C++(www.cppentry.com)函数原型: void Print(const char *str)

  输入样例: abc

  分析:

  n个字符串的全排列就是n!,而由于2^32=4294967296,12!=479001600,11!=39916800,

  本文讨论的算法在限制n<12,关于n>=12的后续讨论。

  另外这里输入的字符也是不重复的,重复的相对复杂,后续可以讨论。

  思想是这样的:比如输入字符串是abc,定义vectorA、vectorB.

  先取a放到vectorA中,

  然后取b,与进行组合,则有ba,ab,放到vectorB中,同时清空vectorA.

  再取c,与vectorB里的ba,ab分别组合。依次得到cba,bca,bac和cab,acb,abc,放到vectorA中。

  最后遍历不为空的vector,打印出组合结果。

  这个算法就是逐个追加组合算法。

  代码实现如下:

  #define MAXNUM 12

  //定义2个放结果的vector,交替使用。

  std::vector<char*> g_vecA;

  std::vector<char*> g_vecB;

  void Print(const char *str)

  {

  char Temp;

  int nLen = strlen(str);

  char Temp0 ;

  Temp0[0]=str[0];

  Temp0 ='\0';

  g_vecA.push_back(Temp0);//先把第一个字母放到容器里

  vector<char*>::iterator itor;

  for (int i=1; i<nLen; i++)

  {

  Temp = str[i];

  if (g_vecA.size()==0)

  {

  //遍历B中的元素

  for(itor=g_vecB.begin();itor!=g_vecB.end();itor++)

  {

  char* p = *itor;

  int nSize = strlen(p);

  //从0到nSize位置放Temp

  for (int j=0; j<nSize+1; j++)

  {

  char* q = new char[nSize+2];//如果放在循环外面则最后都是一个值

  for (int k=0; k<j; k++)

  {

  q[k]=p[k];

  }

     

首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇求出最短路径实例分析 下一篇C++中虚函数功能的实现机制

评论

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