天天看点

3、给出一个函数输出字符串的所有排列

 template <typename T>

 void printVect(vector<T>& s)

 {

typename vector<T>::iterator beg = s.begin();

while(beg != s.end())

cout << *beg++;

cout  << endl;

 }

 void arrangementRecursive(char * str, vector<char>&cvect)

 {

if(*str == '\0')

{

//打印结果

printVect(cvect);

return;

}

int length = strlen(str);

//函数改变str, 使用tempStr,递归后恢复. 同时保证showArrangement("abc")访问不越界

char * tempStr = new char[length + 1];

for(int i = 0; i < length; ++i)

{

strcpy_s(tempStr, length + 1, str);

//第一个元素和后面元素交换

swap(tempStr[i], tempStr[0]);

//进栈

cvect.push_back(tempStr[0]);

//n - 1个元素全排列

arrangementRecursive(tempStr + 1, cvect);

//以*str开头的排列完成,出栈

cvect.pop_back();

}

delete [] tempStr;

 }

 void showArrangement(char * str)

 {

if(!str)

return;

//cvect保存要打印的排列

vector<char> cvect;

arrangementRecursive(str, cvect);

 }

继续阅读