字符串的全排列两种方法

输入一个字符串,其含有的字符各不相同。程序输出该字符串的所有排列(全排列)情形。
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、……这些字母出现的次数

posted @ 2015-11-25 14:40  刘丹wood  阅读(2452)  评论(0编辑  收藏  举报