關於輸入一個字符串,對其進行全排列的兩種算法

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章