算法题:用你熟悉的编程(www.cppentry.com)语言,设计如下功能的函数:
输入一个字符串,输出该字符串中所有字母的全排列。程序请适当添加注释。
C++(www.cppentry.com)函数原型: void Print(const char *str)
输入样例: abc
分析:
n个字符串的全排列就是n!,而由于2^32=4294967296,12!=479001600,11!=39916800,
本文讨论的算法在限制n<12,关于n>=12的后续讨论。
另外这里输入的字符也是不重复的,重复的相对复杂,后续可以讨论。
思想是这样的:比如输入字符串是abc,定义vectorA、vectorB.
先取a放到vectorA中,
然后取b,与进行组合,则有ba,ab,放到vectorB中,同时清空vectorA.
再取c,与vectorB里的ba,ab分别组合。依次得到cba,bca,bac和cab,acb,abc,放到vectorA中。
最后遍历不为空的vector,打印出组合结果。
这个算法就是逐个追加组合算法。
代码实现如下:
#define MAXNUM 12
//定义2个放结果的vector,交替使用。
std::vector<char*> g_vecA;
std::vector<char*> g_vecB;
void Print(const char *str)
{
char Temp;
int nLen = strlen(str);
char Temp0 ;
Temp0[0]=str[0];
Temp0 ='\0';
g_vecA.push_back(Temp0);//先把第一个字母放到容器里
vector<char*>::iterator itor;
for (int i=1; i<nLen; i++)
{
Temp = str[i];
if (g_vecA.size()==0)
{
//遍历B中的元素
for(itor=g_vecB.begin();itor!=g_vecB.end();itor++)
{
char* p = *itor;
int nSize = strlen(p);
//从0到nSize位置放Temp
for (int j=0; j<nSize+1; j++)
{
char* q = new char[nSize+2];//如果放在循环外面则最后都是一个值
for (int k=0; k<j; k++)
{
q[k]=p[k];
}