输入一个字符串输出它的全排列

 #include <stdio.h> 
#include <string.h> 
#include <memory.h> 
int m;//记录字符串长度 
int n;//记录字符串中的字符种类数 
char map[256];//记录是哪几种字符 
int count[256];//记录每种字符有多少个 

void Make_Map(char *str)//统计字符串的相关信息 

int s[256]; 
int i; 
memset(s,0,sizeof(s)); 
memset(count,0,sizeof(count)); 
m=strlen(str); 
while(*str) 

s[*str]++; //*str为字符,s[字符],字符转换成ASCII码,s[字符]++,同一种类字符计数,原来为0,
str++; //(接上)这是一种常见的映射.

n=0; 
for (i=0;i<256;i++) 
if (s[i]) 

map[n]=i; //n记录了字符种类数,map[n]记录了原来*str的值.
count[n]=s[i]; //count[n]记录每种字符的个数
n++; 



int stack[1000];//递归用的栈,并记录当前生成的排列 

void Find(int depth)//递归式回溯法生成全排列 

int k=0;
if (depth==m) 

int i; 
for (i=0;i<depth;i++) {putchar(map[stack[i]]); 
//printf("%d\n",k);
}
putchar('\n'); 

else 

int i; 
for (i=0;i<n;i++) //这里开始只用到map,count数组,他们分别记录了字符ascii,相同字符出现个数.
if (count[i])  

stack[depth]=i; //先把这个值存到堆栈,
count[i]--; //后面递归不用这个值了,减掉一个
Find(depth+1); //假设这个能得到子序列的全排列
count[i]++; //处于当前循环中,恢复这个值,这是因为全排列的算法要求,
  //考虑第一层,即取ri,对但是要对剩余的 n-1个数取全排列
   




void main() 

char str[1000]; 
gets(str); 
Make_Map(str); 
Find(0); 
}
===============================================
全排列的算法
perm(m)为m个数r1,r2,.....rm的全排列
riperm(m-1),表示取出ri,然后对剩余的m-1个数进行全排列.
 则perm(m)可表示为
r1perm(m-1),r2perm(m-1),...rmperm(m-1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值