关于输入一个字符串,对其进行全排列的两种算法

输入一个字符串,其含有的字符各不相同。程序输出该字符串的所有排列(全排列)情形。
<span style="font-family:SimSun;font-size:14px;">void f(char *str, int len, int n)
{   
    int i;   
    char tmp;   
    char *p = (char *)malloc(len+1);   
    if(n==len-1){   
        printf("%s\n",str);   
    }else{   
        for(i=n;i<len;i++){   
            strcpy(p,str);   

            tmp = *(str+n);   
            *(str+n) = *(str+i);   
            *(str+i) = tmp;   
	    f(str,len,n+1);   
            strcpy(str,p);   
        }   
    }   
    free(p);   
}   

int main(int argc, char **argv)
{   
    char str[] = "xyz";   
    f(str,3,0);   
    printf("\n");   
    return 0;   
}</span>


例如:给定字符串“xyz”,则程序输出:
xyz
xzy
yxz
yzx
zyx

zxy

同样输入一段字符串,这里可以包含重复字符串,输出全排列。

#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++; 
	} 
	n=0; 
	for (i=0;i<256;i++) 
		if (s[i]) 
		{ 
			map[n]=i; 
			count[n]=s[i]; 
			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++) 
				if (count[i]) 
				{ 
					stack[depth]=i; 
					count[i]--; 
					Find(depth+1); 
					count[i]++; 
				} 
		} 
} 
 
int main() 
{ 
	char str[1000]; 
	gets(str); 
	Make_Map(str); 
	Find(0); 
	return 0;
}


注意:如果遇到A,s[*str]++表示s[65]++,遇到B,则s['B']++
最终,s['A'],s['B'],s['C']...的值就是A、B、……这些字母出现的次数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值