/************************************************************************/
/* 面試題:請編寫一個函數(shù),把字符串中的所有字符子串的各種組合形式全部都顯示出來。
字符子串的長度范圍是從一個字符到字符串的長度。
不管排列順序如何,只要兩種組合中的字符完全一樣,它們就是同一種組合。
比如:給定字符串"hart",則"ha"和"har"是不同的組合,而"ha"和"ah"是相同的組合。
排列方式:不以字符串多少為排列區(qū)分,而是以是否確定某一字符來確定字符子串
以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 ,就成了新的組合。
根據(jù)這樣的特點:我們設(shè)計一個遞歸算法
(1)從首字符到尾字符的各個字符,循環(huán)
(2)輸出被循環(huán)到的字符
(3)如果循環(huán)的字符 后面還有字符,遞歸;以后面的字符為起點,重復步驟(2)和步驟(3)
(4)如果被循環(huán)到的字符后面沒有字符,跳出循環(huán)。
畫圖的話,看成如下:以行為單位輸出,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"; //此法當有重復字母時,結(jié)果是錯誤的
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;
}