【剑指offer28】字符串的全排列和组合

题目:输入一个字符串或一组数字,输出其全部的排列和组合

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值