题目:输入一个字符串,打印出该字符串中字符的所有排列。例如:输入字符abc,则打印所有组合字符串:abc,acb,bac,bca,cab,cba
分析:把复杂的问题进行分解,变成更小的问题。分治法一般很容易想到用递归。
首先理解递归:参见http://www.cnblogs.com/zhangqqqf/archive/2008/09/12/1289730.html
递归算法有四个特性:
必须有可达到的终止条件,否则程序陷入死循环 (结合本题,本题终止条件是?这一点很重要)
子问题在规模上比原问题小
子问题可通过再次递归调用求解
子问题的解应能组合成整个问题的解
通过找规律,求字符串的全排列,可以看出三步:
首先,求所有可能出现在第一个位置的字符,
其次,把第一个字符和其后面的字符一一交换。如下图所示,分别把第一个字符a和后面的b、c等字符交换的情形。
接着,固定第一个字符,求后面所有字符的排列。这个时候我们仍把后面的所有字符分成两部分:后面字符的第一个字符,以及这个字符之后的所有字符。然后把第一个字符逐一和它后面的字符交换
下面的递归的图示意图:
代码结合上面的示意图看就非常清晰了:
#include<iostream> using namespace std; #include<assert.h> void Permutation(char *pStr,char *pbegin) { assert(pStr&&pbegin); if (*pbegin == '