字符串的全排列两种⽅法输⼊⼀个字符串,其含有的字符各不相同。程序输出该字符串的所有排列(全排列)情形。
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");
return0;
}
例如:给定字符串“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);
return0;
}
注意:如果遇到A,s[*str]++表⽰s[65]++,遇到B,则s['B']++
最终,s['A'],s['B'],s['C']...的值就是A、B、……这些字母出现的次数
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论