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