字符串的全排列兩種方法


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM