
准备回老家找工作了,复习下算法。
题目:输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。
拿到这种题目,我们要从小的数量级开始分析,由小及大便能找到规律。这里我们拿abc字符串举例进行分析。
(c)
有c, c
无c, 空
(b,c)
有b, b (c)
无b, (c)
(a,b,c)
有a, a (b,c)
-> 有a,无b,无c ->a
-> 有a,无b,有c ->ac
-> 有a,有b,无c ->ab
-> 有a,有b,有c ->abc
无a, (b,c)
-> 无a,无b,无c ->空
-> 无a,无b,有c ->c
-> 无a,有b,无c ->b
-> 无a,有b,有c ->bc
由此我们能找到规律,任意字符串的所有组合可以总结为:
第1字符存在的情况余下字符串的组合 和 第1字符不存在的情况余下字符串的组合。这是妥妥的递归的味道。
这里用C++代码实现,devc++ 编译器编译运行。
#include // assert
#include // cout
using namespace std;
// 组合
void combination(char* pBegin, char* pResult, char* pResultCur)
{
assert( pBegin && pResult && pResultCur);
if(*pBegin == ')'<<
{
cout << pResult ; endlreturn
;}
// 2部分可以换顺序
*
=pResultCur 0 ;combination
(+pBegin1,, pResult) pResultCur;// 无当前元素,不存储,pResultCur不变 *
=pResultCur * ;pBegincombination
(+pBegin1,, pResult+ pResultCur1);// 有当前元素,存储当前元素,将pResultCur往后走 }
int
main (int, argcchar *[ argv])char
{
[ pData4]= "abc" ;char
[ pResult4]= 0 {};combination
(,pData, pResult) pResult;return
0 ;}
运行结果
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)