分享

字符子串 任意组合 递归

 孤步 2012-07-30

/************************************************************************/

/* 面试题:请编写一个函数,把字符串中的所有字符子串的各种组合形式全部都显示出来。

 

  字符子串的长度范围是从一个字符到字符串的长度。

  不管排列顺序如何,只要两种组合中的字符完全一样,它们就是同一种组合。

  比如:给定字符串"hart",则"ha""har"是不同的组合,而"ha""ah"是相同的组合。

 

  排列方式:不以字符串多少为排列区分,而是以是否确定某一字符来确定字符子串

  hart作为字符串,则如下:

  h        ha  har  hart hat hr hrt      ht

               a   ar   art  at

                                                  r  rt

                                                                 t

 

  可以看出:第一行全有h,第二行没有h,全是art,第三行没有ha,全是rt,第四行没有har,就只有t

  如果第一行去掉 h,恰好是 第二行 第三行 第四行 的全部,正好是 3个字符art的组合,

  再黏上一个 h ,就成了新的组合。

  根据这样的特点:我们设计一个递归算法

  1)从首字符到尾字符的各个字符,循环

  2)输出被循环到的字符

  3)如果循环的字符 后面还有字符,递归;以后面的字符为起点,重复步骤(2)和步骤(3

  4)如果被循环到的字符后面没有字符,跳出循环。

 

  画图的话,看成如下:以行为单位输出,1表示此字符输出

    h a r t             h a r t 

  h 1 . . .                      h 1 . . .

  a 1 1 . .    --   a 1 1 . .

  r 1 1 1 .                     r 1 1 . 1 //下一行返回后,本行往下一列进行,后面的依次类推

  t 1 1 1 1(return  t 1 1 1 1

                                                                     */

/************************************************************************/

 

#include <stdlib.h>

#include <stdio.h>

#include <iostream>

using namespace std;

 

int length;

char *out;

char str[]="hart";  //此法当有重复字母时,结果是错误的

int sum=0;

 

void DoCombine(char in[],char out[],int length,int rec,int start)//rec看成行,

{

       int i;

       for( i = start; i < length; i++)//i看成列

       {

              out[rec] = in[i];

              out[rec+1] =0;

              printf("%s\n",out);

              if(i< length-1)

                     DoCombine(in,out,length,rec+1,i+1);

       }

}

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

{

       length = strlen(str);

       out = (char *)malloc(length +1);

       DoCombine(str,out,length,0,0);

       getchar();

       return 0;

}

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多