打印字符串(C语言,全排列)

题:输入一个小于26的数字n, 代表从字母a开始的一串长度为n的连续字符,如4表示abcd。 请输出这串字符的所有可能排列。

根据提示,补充一个函数int print(int n,char result[][27]),其中n是输入的字符数目,你需要生成全排列,并填写到result数组中。
如果需要,你也可以自己在编辑器中添加子函数。

例:

n=3时
result前6行包含:
abc
acb
bac
bca
cab
cba
(提示:result的行次序并不重要,只要是这6个即可)

解析:
n个值得全排列数目为n!。第一个位置的可能性是n种,那么一共是n*(n-1)!种,同理依次递推。

int next=0;
char s[27];

int pai(int start, int end, char result[][27]){
	if (start >= end) {  # 全部遍历后
		s[end]=0;
	    strcpy(result[next], s);  # 存入一种可能性
		next += 1;  # 计数器
	} else 
	 for(int i=start; i<end; i++){
	    char c;
		c=s[start];
	    s[start]=s[i];
		s[i]=c;
	//  swap(s[start], s[i])  # 交换当前位置的可能的值,第一次原地交换,因为当前值的可能性也需要存入
	
		pai(start+1,end,result);  # 进入(n-1)的全排列
		
		c=s[start];
	    s[start]=s[i];
		s[i]=c;
	//  swap(s[start], s[i]);  # 换回之前交换的值,以免位置错乱。
	 }
	 return 0;	
}

int print(int n,char result[][27]){
/*下面填写函数的代码*/
   char longstr[]="abcdefghijklmnopqrst";
   longstr[n]=0;
   strcpy(s, longstr);
   pai(0,n, result);
/********结束******/
}

这题是经典的全排列回溯法模板。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值