题目:输入一个字符串或一组数字,输出其全部的排列和组合
1.用递归实现全排列——时间复杂度为O(nlogn),空间复杂度为O(1).
/**
* description:实现字符串的全排列
*
* @param pString
* 要全排列的字符串
* @param length
* 要全排列的字符串的长度
* @param k
* 需要调整的子串的起始位置
*/
void permutation(char* pString, int length, int k) {
if (NULL == pString || 0 >= length || 0 > k || k > length) {
return;
}
//递归结束条件
if (k >= length) {
cout << pString << endl;
return;
}
//注意循环的起始条件
for (int i = k; i < length; ++i) {
std::swap(pString[k], pString[i]);
permutation(pString, length, k + 1);
std::swap(pString[i], pString[k]);
}
}
测试代码
/*
*
* Created on: 2014-4-9 21:51:39
* Author: danDingCongRong
*
*/
#include <iostream>
#include <cstdio>
#include <stddef.h>
using namespace std;
void copyString(char* array, char* result, int length) {
if (NULL == array || NULL == result || 0 >= length) {
cout << "Invalid Parameter." << endl;
return;
}
for (int i = 0; i < length; ++i) {
result[i] = array[i];
}
result[length] = '\0';
}
int main() {
int length = 0;
cout << "请输入字符串的长度:" << endl;
while (cin >> length) {
char* pSource = new char[length + 1];
getchar();
gets(pSource);
*(pSource + length) = '\0';
cout << pSource << endl;
//实际操作的字符串
char* pChar = new char[length + 1];
copyString(pSource, pChar, length);
cout << "全排列:" << endl;
permutation(pChar, length, 0);
delete pChar;
delete pSource;
cout << "请输入字符串的长度:" << endl;
}
return 0;
}