首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

字符排列有关问题

2012-11-03 
字符排列问题Description有n个字母,列出由该字母组成的字符串的全排列(相同的排列只计一次)。Input第一行输

字符排列问题
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);} 

热点排行