輸入一個字符串,其含有的字符各不相同。程序輸出該字符串的所有排列(全排列)情形。
<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
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、……這些字母出現的次數