读书人

字符排列有关问题

发布时间: 2012-11-03 10:57:44 作者: rapoo

字符排列问题
Description

有n个字母,列出由该字母组成的字符串的全排列(相同的排列只计一次)。

Input

第一行输入是字母个数n,1<=n<=20。接下来一行输入的是待排列的n个字母。

Output

计算出的n 个字母的所有不同排列总数

Sample Input

4
aacc

Sample Output

6

///以上是题目。。
谢谢各位花时间看。。我说下我的思路。
我先写个函数,把下标整合成一个二位数,然后把这个二位数的个位十位颠倒。把颠倒后的数进行查找如果有相同的就清除掉,最后输出剩余的个数。。
请问对吗?谁有更简单的方法?谢谢

[解决办法]
仅供参考

C/C++ code
#include <stdio.h>#include <string.h>#include <stdlib.h>int m;//记录字符串长度int n;//记录字符串中的字符种类数char map[256];//记录是哪几种字符int count[256];//记录每种字符有多少个int stack[1000];//递归用的栈,并记录当前生成的排列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++;        }}void Find(int depth) {//递归式回溯法生成全排列    if (depth==m) {        int i;        for (i=0;i<depth;i++) putchar(map[stack[i]]);        putchar('\n');    } else {        int i;        for (i=0;i<n;i++)            if (count[i]) {                stack[depth]=i;                count[i]--;                Find(depth+1);                count[i]++;            }    }}void main(int argc,char**argv) {    if (argc<2) {        printf("%s 要产生全排列的字符串\n",argv[0]);        return;    }    Make_Map(argv[1]);    Find(0);} 

读书人网 >C语言

热点推荐