可达编程 有重复元素的排列问题

问题描述

设R={ r 1 , r_2 , …, r n }R=r1,r2​,…,rn是要进行排列的nn个元素。其中元素r1 , r2 , …, rnr1,r2,…,rn 可能相同。试设计一个算法, 列出RR的所有不同排列。

给定nn 以及待排列的nn个元素。计算出这nn 个元素的所有不同排列。

输入格式

第1行是元素个数n,1\le n\le 500n,1≤n≤500。

接下来的1行是待排列的nn个元素。

输出格式

计算出的nn个元素的所有不同排列。

最后1行中的数是排列总数。

输出按照字典序从小到大输出。字典序比较大小方法为从第一个数字开始比较,若不同则比较出来大小,否则接着比较第二位,直到比较出来大小位置。样例中就是按照字典序排序后的结果。

输入输出样例

输入样例

4
aacc

Copy

输出样例

aacc
acac
acca
caac
caca
ccaa
6

 

 

上代码!!!

#include<bits/stdc++.h> 
using namespace std; 
const int N = 505; 
char s[N]; 
int n,a[30],len,tot; 
void search(int k){ 
	if (k==len){ 
		tot++; 
		cout<<s<<endl; 
		return; 
	} 
	for (int i=0; i<26; i++) 
		if (a[i]){ 
			s[k] = 'a'+i; 
			a[i]--; 
			search(k+1); 
			a[i]++; 
	} 
} 
int main(){ 
	scanf("%d%s",&n,s); 
	len = strlen(s); 
	for (int i=0; i<len; i++) 
		a[s[i]-'a']++; 
	search(0);
	printf("%d\n",tot); 
	return 0; 
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值