标签:
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; }
例如:给定字符串“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、……这些字母出现的次数
标签:
原文地址:http://www.cnblogs.com/liudan520/p/4994618.html