输入一个字符串输出它的全排列
2011-10-23 16:13
169 查看
#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为字符,s[字符],字符转换成ASCII码,s[字符]++,同一种类字符计数,原来为0,
str++; //(接上)这是一种常见的映射.
}
n=0;
for (i=0;i<256;i++)
if (s[i])
{
map
=i; //n记录了字符种类数,map
记录了原来*str的值.
count
=s[i]; //count
记录每种字符的个数
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++) //这里开始只用到map,count数组,他们分别记录了字符ascii,相同字符出现个数.
if (count[i])
{
stack[depth]=i; //先把这个值存到堆栈,
count[i]--; //后面递归不用这个值了,减掉一个
Find(depth+1); //假设这个能得到子序列的全排列
count[i]++; //处于当前循环中,恢复这个值,这是因为全排列的算法要求,
//考虑第一层,即取ri,对但是要对剩余的n-1个数取全排列
}
}
}
void main()
{
char str[1000];
gets(str);
Make_Map(str);
Find(0);
}
===============================================
全排列的算法
perm(m)为m个数r1,r2,.....rm的全排列
riperm(m-1),表示取出ri,然后对剩余的m-1个数进行全排列.
则perm(m)可表示为
r1perm(m-1),r2perm(m-1),...rmperm(m-1)
#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为字符,s[字符],字符转换成ASCII码,s[字符]++,同一种类字符计数,原来为0,
str++; //(接上)这是一种常见的映射.
}
n=0;
for (i=0;i<256;i++)
if (s[i])
{
map
=i; //n记录了字符种类数,map
记录了原来*str的值.
count
=s[i]; //count
记录每种字符的个数
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++) //这里开始只用到map,count数组,他们分别记录了字符ascii,相同字符出现个数.
if (count[i])
{
stack[depth]=i; //先把这个值存到堆栈,
count[i]--; //后面递归不用这个值了,减掉一个
Find(depth+1); //假设这个能得到子序列的全排列
count[i]++; //处于当前循环中,恢复这个值,这是因为全排列的算法要求,
//考虑第一层,即取ri,对但是要对剩余的n-1个数取全排列
}
}
}
void main()
{
char str[1000];
gets(str);
Make_Map(str);
Find(0);
}
===============================================
全排列的算法
perm(m)为m个数r1,r2,.....rm的全排列
riperm(m-1),表示取出ri,然后对剩余的m-1个数进行全排列.
则perm(m)可表示为
r1perm(m-1),r2perm(m-1),...rmperm(m-1)
相关文章推荐
- Swift - 排列组合之全排列 (输入一个字符串,输出该字符串包含的字符的所有组合)
- 在控制台上输入一个字符串,将其中夹杂的字母去除,只剩数字,然后对对这些数字进行全排列,输出全排列结果
- 输入一个字符串,要求输出字符串中字符所有的排列,例如输入"abc",得到"abc","acb","bca","bac","cab","cba"
- 题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。
- 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。
- C#实现输入一个字符串输出该字符串字符的所有排列方式
- 题目:剔除一个字符中重复的字符,然后按ASCII码值从小到大排列。 例如,输入:abbcccddeeeffgghh 输出:abcdefgh 注意:1、剔除是整个字符串中重复的字符,而不是连续的字符 2
- 在控制台上输入一个字符串,将其中夹杂的字母去除,只剩数字,然后对对这些数字进行全排列,输出全排列结果
- 输入一个字符串并且逆序输出
- 10、 java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 要求不能出现截半的情况
- 华为上机笔试之通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
- 输入一个字符串,输出长度最长的单词
- 习题 7.9 编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格、和其他字符的个数,在主函数中输入字符串以及输出上述的结果。
- 输入一个整数,将这个整数以字符串的形式逆序输出 程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001
- 输入一个字符串,统计共有多少个整数并输出。
- [Java练习]输入一个字符串,输出其中某个小写字母出现的次数
- 写正确函数需要注意的地方:输入一个字符串,打印出该字符串中字符的所有排列
- 输入一个字符串,打印出该字符串中字符的所有排列
- 从键盘输入一个由字母构成的字符串(不大于30个字符),要求从该串中取出3个不重复的字符,求所有不同的取法。如果字符串中没有取到3个不同的字符,则提示没有结果。对取出的字符要求按字母升序排列成串,对于不
- 输入一个表示整数的字符串,把该字符串转换成整数并输出(实现atoi函数功能)