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);
}