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

简介:
字母表 ∑ 为  {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

相关文章
|
17天前
|
算法
一道算法题
一道算法题
6 0
|
10月前
|
自然语言处理 算法 程序员
解答算法题的一个小技巧
解答算法题的一个小技巧
|
2月前
|
自然语言处理 算法 数据处理
什么是算法
什么是算法
30 0
|
算法
算法练习——(2)逢7过
中国朋友们聚会时喜欢玩"逢7过"的游戏,老外有个同样的游戏,FlipFlop,它从1计数到100,顺序输出。当遇到3的倍数就要说“Flip”,遇到5的倍数就要说“Flop”,既为3的倍数又为5的倍数则要说“FlipFlop”,说错的话表演节目或罚酒。
151 0
|
算法
A*算法
A*算法
180 0
A*算法
|
设计模式 缓存 算法
算法总结
历经两个月的时间,将算法知识重新梳理完成,整个过程挺累的,每天只能晚上或者周六周日梳理一部分,虽然占用了大量的休息时间,不过整个过程很充实,而且也重新学到了不少东西。
|
算法
超实用的算法小技巧
本篇文章我们将介绍一些超级实用的算法小技巧,灵活使用这些算法小技巧可以帮助我们更好的解决遇到的问题,让我们的时间复杂度,空间复杂度大大降低,有效的提高我们的编程能力。
131 0
|
算法 安全 数据安全/隐私保护
聊聊 A5/1 算法
A5 算法在 1989 年由法国人开发,先后开发了三个版本记作 A5/1、A5/2、A5/3,如果没有特别说明,通常所说的 A5 是指 A5/1,这是一种流密码加密算法。该算法用于 GSM 系统的序列密码算法,最初是保密的,但通过泄漏和逆向工程公开。
聊聊 A5/1 算法
|
算法 前端开发 rax
举轻若重,于无声处听惊雷,那些平平无奇的伟大算法
遥想笔者读大学时在技术讨论时多是储如i+=(++i)+(i++)之类的孔乙己式的问题,而最近我们关注的热点要不是删库跑路坐牢的程序员,要不是员工离职倾向分析系统;而反观国外大神的博客,要不就是这种切入点非常简单,但是最终能够升华至编程之道层面的举轻若重的文章,要不就是秀出那些智商碾压的神仙代码,从这个角度上看我们国内的IT技术氛围还有极大的提升空间。
举轻若重,于无声处听惊雷,那些平平无奇的伟大算法
|
算法
A*算法之在U3d下实现简单的自动寻路
算法简介: A搜寻算法俗称A星算法。A算法是比较流行的启发式搜索算法之一,被广泛应用于路径优化领域[。它的独特之处是检查最短路径中每个可能的节点时引入了全局信息,对当前节点距终点的距离做出估计,并作为评价该节点处于最短路线上的可能性的量度。
1248 0