字符串全排列问题 您所在的位置:网站首页 字符有多少 字符串全排列问题

字符串全排列问题

2024-07-18 01:59| 来源: 网络整理| 查看: 265

这几天一直在思考一个问题,一个字符串的排列方式有多少种?正好有阿里巴巴校园招聘的一道题目:

问“alibaba”这个字符串的排列方式有多少种?

看到这个问题,排列这个字眼,是不是有点眼熟,是啊!高二时候学习的排列组合问题,概率里面的。这算算都快10年过去了。

这里我们利用排列组合的问题解决这个问题。

看了下这个字符串,一共有7个字符,字符'a'出现了三次,字符'b'出现了2次,剩下了'l'与‘i’。

选择7个空位,这里由于相同的字符在每个空位置出现都是一样的,所以先安排重复的字符。

先考虑'a',一共有C73(ps就是组合里的C)种方法,然后是出现两次的'b';

这时候7个空位中已经有三个位置被选了,只剩下4个了,从这四个里面选择两个位置给‘b’,一共有C42种方法;

然后,7个空位剩下了2个了,个两个不同字符,有A22种排列方式。

所以总的字符串排列方式有C73*C42*A22=420种。

以上是利用了概率的方式来解答这个问题,怎么通过编程的方式实现呢?怎么设计算法呢?

还是查看一个简单的字符串吧,比如“xyz”。这个字符串一共有xyz,xzy,yxz,yzx,zxy,zyx。一共六种排列方法。

仔细观察这六种序列,是分别将x,y,z换到字符串的首位,然后对剩下的字符串进行排列。

这里为了更好地说明,我对新的字符串“xyza”这个排列逐层解析。

                                               第一层                      第二层              第三层      

第一行                                   x   yza                      x   y  za            x   y  z  a

                                                                                                           x  y  a   z

                                                                                x   z  ya            x   z a   y

                                                                                                           x   z  y   a

                                                                                 x   a   yz           x   a  y   z                                                                                                

                                                                                                          x   a  z   y

第二行                                  y   xza                      y  x  za               y  x z    a

                                                                                                           y   x a   z 

                                                                               y   z  xa              y   z  x   a

                                                                                                            y   z a    x 

                                                                                 y   a  xz             y   a  x   z 

                                                                                                             y   a  z   x 

第三行                                   z   yxa                      z  y  xa                 z  y  x    a

                                                                                                              z  y a    z

                                                                                z  x  ya                  z  x  y    a

                                                                                                              z  x  a    y

                                                                               z  a  xy                   z  a  x    y 

                                                                                                              z  a y    x   

第四行                                   a   yzx                      a y  zx                a   y  z   x

                                                                                                             a   y  x   z

                                                                               a  z  yx                 a  z  y    x

                                                                                                             a  z  x    y

                                                                                a  x  yz                a  x  y    z

                                                                                                             a  x   z   y   

                                        

这里可以明显地看出这是个递归运算,第一层是将字符串后面所有的字符分别进行置换,第二层与第一层执行的方式相似,这次只关注子串,然后第三层也是类似,终止条件子串已经到达字符串末尾。

然后按照这个思路我们有下面的代码:

void rank(char *str,int begin,int end) { int k; if(begin==end-1) { count++; printf("%s\t",str);//1 } for(k=begin;k


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有