求字符串的所有组合输出

来源:互联网 发布:淘宝乔丹运动鞋男鞋 编辑:程序博客网 时间:2024/06/06 04:51

剑指Offer一书中面试题28求字符串的排列,给出了递归算法程序。其中扩展题目中提到了,求字符串的所有组合。比如输入字符串:“abc”,输出应为:a、b、c、ab、ac、bc、abc.

借用书上的解题思路:如果输入n个字符,则这n个字符能构成长度为1、长度为2、......长度为n的组合。在求长度为m的组合时,可考虑将这n个字符分成两部分:第一个字符和其余所有的字符。如果组合里包含第一个字符,则下一步在剩余的字符里选取m-1个字符;如果不包含第一个字符,则下一步在剩余的字符里选取m个字符。

思想比较简单巧妙,下面是我给出的实现代码:

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
void Combine(int ilen,char* pStart,char* PEnd,string strBefore)
{

if (ilen<0||pStart+ilen-1>PEnd)
{
return;
}
else
{
if (pStart+ilen-1==PEnd)
{
if (!strBefore.empty())
{
cout<<strBefore;
}
printf("%s\n",pStart);
}
else
{
if (ilen==0)
{
if (!strBefore.empty())
{
cout<<strBefore;
cout<<endl;
}
}
else
{
Combine(ilen,pStart+1,PEnd,strBefore);//不包含第一个字母
strBefore.push_back(*pStart);
Combine(ilen-1,pStart+1,PEnd,strBefore);
}
}

}



}
void Combine(char* pStr,int ilen)
{
if (pStr==NULL||ilen<1)
{
return;
}
char* pEnd=pStr+ilen-1;
string strb;
for (int i=1;i<=ilen;i++)
{
if (!strb.empty())
{
strb.clear();
}
Combine(i,pStr,pEnd,strb);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char* str="abcd";
Combine(str,4);

return 0;
}

运行结果如图:







原创粉丝点击