排列组合算法笔记

1.不存在重复字符的排列组合

如abc,此种情况很简单,算法代码也很少,主要思想为:

  • 将abc分为前部和后部,前部为a,后部abc,用a与后部每一个字符交换,如a<->a得到abc,a<->b得到bac,a<->c得到cba,最终得到abc,bac,cba三部分
  • 针对上一部分中的三个后部,分别继续应用分两部,分别交换的方法,直到后部为NULL,递归输出字符串。
上述方法的递归代码如下:

#include<iostream>
using namespace std;
void swap(char *pChar1,char *pChar2)
{
	char temp;
	temp=*pChar1;
	*pChar1=*pChar2;
	*pChar2=temp;
}
void FullArry(char *cStr,char *pFirstChar)
{
	char *pNode;
	if(NULL==cStr)
		return;
	if('\0'==*pFirstChar)
	{
		cout<<cStr<<endl;
	}

	for(pNode=pFirstChar;*pNode!='\0';pNode++)
	{
		swap(pFirstChar,pNode);
		FullArry(cStr,pFirstChar+1);
		swap(pFirstChar,pNode);
	}
	return ;
}

int main()
{
	char a[10000];
	cin>>a;
	FullArry(a,a);
	return 0;
}

输入abc,结果为:

如果输入abb

2.存在重复字母的排列组合

结果显然不符合要求,原因是因为 1.前部与后部相同的情况,我们进行了对换。2.后部如果有多个字符相同,只需要在该字符第一次出现的时候对换前后部字符。

针对上述的情况,修改代码如下&

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值