字符排列问题
Description
有n个字母,列出由该字母组成的字符串的全排列(相同的排列只计一次)。
Input
第一行输入是字母个数n,1<=n<=20。接下来一行输入的是待排列的n个字母。
Output
计算出的n 个字母的所有不同排列总数
Sample Input
4
aacc
Sample Output
6
///以上是题目。。
谢谢各位花时间看。。我说下我的思路。
我先写个函数,把下标整合成一个二位数,然后把这个二位数的个位十位颠倒。把颠倒后的数进行查找如果有相同的就清除掉,最后输出剩余的个数。。
请问对吗?谁有更简单的方法?谢谢
[解决办法]
仅供参考
#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);}