准备回老家找工作了,复习下算法。
题目:输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入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 << endl; return; } // 2部分可以换顺序 *pResultCur = 0; combination(pBegin+1, pResult, pResultCur); // 无当前元素,不存储,pResultCur不变 *pResultCur = *pBegin; combination(pBegin+1, pResult, pResultCur+1); // 有当前元素,存储当前元素,将pResultCur往后走 } int main(int argc, char* argv[]) { char pData[4] = "abc"; char pResult[4] = {0}; combination(pData, pResult, pResult); return 0; }



