【算法】求字母表∑的所有情况

字母表 ∑ 为  {a , b}
1.设计函数,用以计算建立在 ∑上长度小于N 的字符串的个数,并给出N=5时的字符串个数。
2.在上述功能的基础上,增加列出所有符合条件的字符串功能。

输入输出样例:
输入:
1
输出:
a
b
输入:
2
输出:
aa
ab
ba
bb
输入:
3
输出:
aaa
aab
aba
abb
baa
bab
bba
bbb

AC代码:

//方法1(递归解法):
#include<stdio.h>
int i,n;
char str[50];
void DFS(int k)
{
   if(k<n)
   {
      str[k+1]='a';
      DFS(k+1);

      str[k+1]='b';
      DFS(k+1);
   }
   else
   {
      for(i=1;i<=n;i++)
      {
         printf("%c",str[i]);
      }
      printf("\n");
   }
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
       DFS(0);
    }
    return 0;
}
//方法2(规律解法):
#include<stdio.h>
void zifu(int n)
{
 int i=0,j;
 char a[50]={'a','a'};
 while(1)
 {
  if(i==n)
  {
   for(j=1;j<=n;j++)
    printf("%c",a[j]);
   printf("\n");
  }
  if(i<n)
  {
   a[++i]='a';
   continue;
  }
  while(a[i]=='b') i--;
  if(i>0) a[i]++;
  else break;
 }
}
int main()
{
   int n;
   while(scanf("%d",&n)&&n)
   {
      zifu(n);
   }
 return 0;
}

例如输入3:
结果:
3
aaa
aab
aba
abb
baa
bab
bba
bbb

分析过程:
先是aaa,无b,不执行while,
遇到if,最后一个+1变成b,
回到顶端输出aab。
之后b被while隔过去
剩aa,遇到if,最后一个+1变成b,此时为ab。
回到顶端发现不够3,加一个a(此时为aba),
continue回到顶端,输出aba。
遇到if,最后一个+1变成b,
回到顶端输出abb。
之后bb被while隔过去
剩a,遇到if,最后一个+1变成b,此时为b。
回到顶端发现不够3,加两个a(此时为baa),
continue回到顶端,输出baa。
遇到if,最后一个+1变成b,
回到顶端输出bab。
之后b被while隔过去
剩ba,遇到if,最后一个+1变成b,此时为bb。
回到顶端发现不够3,加一个a(此时为bba),
continue回到顶端,输出bba。
遇到if,最后一个+1变成b,
回到顶端输出bbb。
之后bbb被while隔过去,
剩空串,break出去,算法结束。

即是:一开始是空串,然后遵循一下变化:
1.不够3位,补a。
2.后面有几位b,全去掉,若变成空串退出算法。

3.如果末尾是a,变成b,够3位输出。

//方法3(构建二叉树):
#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
struct per
{
   int L;
   int R;
   char v;
}a[1000*3];
int i,num;
char b[1000*3];
//构建二叉树
void BuildTree(int n,int m)
{
   if(m<10)
   {
       a[n].L=2*n;
       a[2*n].v='a';
       a[n].R=2*n+1;
       a[2*n+1].v='b';
       m++;
       BuildTree(a[n].L,m);
       BuildTree(a[n].R,m);
   }
   else
   {
       return;
   }

}
//查找
void Find(int x,int y,int p,char b[])
{
     p++;
     b[p]=a[x].v;
     if(p==y)
     {
         for(i=1;i<=y;i++)
         printf("%c",b[i]);
         printf("\n");
         return;
     }
     Find(a[x].L,y,p,b);
     Find(a[x].R,y,p,b);
}
int main()
{
    BuildTree(1,0);
    while(scanf("%d",&num)!=EOF)
    {
       a[1].v='a';
       Find(1,num,0,b);
       a[1].v='b';
       Find(1,num,0,b);
    }
    return 0;
}

二叉树遍历字母表∑的模型:

以上算法并不一定是最优的,还有其他方法,就不在一一叙述,有兴趣的可以自己去研究。

转载请注明出处:http://blog.csdn.net/acmman

时间: 2024-10-18 13:34:42

【算法】求字母表∑的所有情况的相关文章

c语言-基于C语言,用蚁群算法求最优路径。百度复制粘贴的别来了。。。要求可以直接运行的代码哈

问题描述 基于C语言,用蚁群算法求最优路径.百度复制粘贴的别来了...要求可以直接运行的代码哈 一个人从上海大学出发,经过若干个地点,路线不重复走,最后回到上海大学,找三条优化路线. 上海大学:北纬N31°19′5.86″ 东经E121°23′21.52″ 星雨城:北纬N31°19′46.58″ 东经E121°24′9.29″ 大康公寓:北纬N31°19′18.88″ 东经E121°25′3.98″ 文景楼:北纬N22°35′23.78″ 东经E113°52′50.67″ 大场中学:北纬N31°

dp-动态规划(DP)算法求出一个问题的所有解

问题描述 动态规划(DP)算法求出一个问题的所有解 具体问题是: 假设有一个楼梯共有N步,你每次可以爬1步或2步.请编写一个函数来计算,有多少种不同的方法可以爬到顶. 此题给出的解如下: int climbStaris(int n){ if(n <= 1) return 1; if(n == 2) return 2; int p = 1, q = 2, curr; for( int i = 3; i <= n; ++i){ curr = p + q; p = q; q = curr; } re

设计-类似最小生成树的算法求解答

问题描述 类似最小生成树的算法求解答 输入一些二元组,二元组代表连通的两个节点.所有的二元组构成一个无向图.现在请你设计一个算法,求出一个最小生成树,使得图中没有回路,并且连接所有节点.输出的数据也用二元组表达. 要用Java或者C#来实现. 解决方案 http://bbs.csdn.net/topics/380240225 解决方案二: 参考我写的迷宫程序,本质上这就是用的最小生成树.

谢谢-PRIM算法求最小生成树

问题描述 PRIM算法求最小生成树 对给定的网和起点,用PRIM算法的基本思想求解出所有的最小生成树, 解决方案 http://www.cnblogs.com/Veegin/archive/2011/04/29/2032388.html 解决方案二: 简单来说思路就是从小到大遍历所有的边,依次添加到图中,如果这个边添加进去会造成回路,就不添加它,找下一个,直到所有的顶点都加入 解决方案三: http://blog.csdn.net/yeruby/article/details/38615045

c++基础-公历转阴历算法求如何实现

问题描述 公历转阴历算法求如何实现 公历转阴历的算法,求C++的具体程序,不需要太复杂,一般就好 公历转阴历算法求如何实现 解决方案 http://download.csdn.net/detail/moontalk001/4510835http://wenku.baidu.com/link?url=x3kqYs4DsCZ2V6ZXyDYwK2qgLC6Y6qR_sfo3m53pxHyFjPh6TQfsu1S9o72x3xdJR9Pp68EBG_iiAHMkuO31a0xSrT2gULHczGQu

统计分析算法求优化方案--多对多数据集合的包含次数统计

问题描述 统计分析算法求优化方案--多对多数据集合的包含次数统计 两组数据,一组为产品ID,一组为专柜号,一个产品会对应多个专柜号,一个专柜号会对应多个产品ID,统计任意两种产品出现在一个专柜里的次数

数据挖掘 weka-利用weka的kmeans算法求词与词之间的相似度

问题描述 利用weka的kmeans算法求词与词之间的相似度 我想求词和词之间的相似度,要求是用weka的kmeans算法,能够计算出聚类中心,余弦相似度.必有重谢 解决方案 有点难度啊!呵呵,10C币有点难

阶乘 算法-网上找的c语言的求大数阶乘的答案 看不太懂这个算法 求大神解释算法

问题描述 网上找的c语言的求大数阶乘的答案 看不太懂这个算法 求大神解释算法 #include int main() { ??? int n; ??? int a[9000]; //确保保存最终运算结果的数组足够大 ???? int digit = 1; //位数 ???? int temp;?? //阶乘的任一元素与临时结果的某位的乘积结果 ???? int i, j, carry; //carry:进位 ???? printf("please in put n:n"); ??? s

ncc-请问哪位大牛有立体匹配方面的,关于NCC算法求深度图的C或C++源码。。。

问题描述 请问哪位大牛有立体匹配方面的,关于NCC算法求深度图的C或C++源码... 在论坛的资源里找了好久也没找到满意的,求大牛啊,最好匹配结果好一点的 解决方案 http://blog.csdn.net/tulun/article/details/6388759