给定一个字符串输出其全部排列的方法
2014-03-05 16:55
423 查看
#include <stdio.h> #include <string.h> #include <stdlib.h> int count = 0; typedef struct { int exist;//这个字符是否存在于字符串中 int *used;//这个字符在全排列处理过程中是否在i位置固定过 }alphabet;//字母表结构体,用哈希表的形式做记录,可以让查询时间缩短至O(1)。 void wholeArray(char *a, char nowlength, alphabet *records) { int i; char guard; alphabet temp[26]; int j, t; if(nowlength == 1) { count ++; printf("%s\n", a); }//递归到底层,输出结果 else { for(i = 0; i < nowlength; i ++) { if(records[a[i] - 'a'].used[nowlength - 1] == 1)//如果这个字符曾经在该位置固定过,则跳过本轮处理 { continue; } else { records[a[i] - 'a'].used[nowlength - 1] = 1; guard = a[nowlength - 1]; a[nowlength - 1] = a[i]; a[i] = guard; for(j = 0; j < 26; j ++) { temp[j].exist = records[j].exist; if(temp[j].exist == 1) { temp[j].used = (int *)malloc(strlen(a) * sizeof(int)); for(t = 0; t < strlen(a); t ++) { temp[j].used[t] = records[j].used[t]; } } }//用temp表复制records表,并传入到递归的下一层中,以免破换records的值,因为records只有在最顶级的循环处理中才能更改,它表示某一个字符所有的全排列结果都已得到 wholeArray(a, nowlength - 1, temp); a[i] = a[nowlength - 1]; a[nowlength - 1] = guard;//返回上层递归时要将局部字符串回归原样 } } } } int main() { char a[10]; alphabet records[26]; int i,j; while(scanf("%s", a) != EOF) { for(i = 0; i < 26; i ++) { records[i].exist = 0; } for(i = 0; i < strlen(a); i ++) { if(records[a[i] - 'a'].exist == 0) { records[a[i] - 'a'].exist = 1; records[a[i] - 'a'].used = (int *)malloc(strlen(a) * sizeof(int)); for(j = 0; j < strlen(a); j ++) { records[a[i] - 'a'].used[j] = 0; } } } count = 0; wholeArray(a, strlen(a), records); printf("count = %d\n", count); } return 0; }用到了一种类似置换的方法~
相关文章推荐
- 给定一个字符串,输出所有的排列组合方式
- 请编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实长度(小于等于1000),同时保证字符串由大小写的英文字母组成。 给定一个string
- 空格替换 请编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实长度(小于等于1000),同时保证字符串由大小写的英文字母组成。 给定一
- 给定一个字符串,输出其所有的可能排列
- 阿里校招笔试——给定一个字符串S和有效单词的字典D,请确定可以插入到S中的最小空格数,使得最终的字符串完全由D中的有效单词组成,并输出解。
- C++输入一个字符串,把其中的字符按照逆序输出的两种方法
- 给定一个字符串和一个整数k,对字符串开头算起的每2k个字符的前k个字符进行反转。 如果还有少于k个字符,则将其全部撤消。 如果小于2k但大于或等于k个字符,则反转前k个字符,
- 输入一个字符串输出它的全排列
- 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。
- python字典分别按照key和value升序或者降序排列--以给定一个含有重复元素的数组list,按照其出现次数大小降序输出
- 【算法拾遗】阿里实习生电面题目:输出给定字符串的全部连续子串
- C++输入一个字符串,把其中的字符按照逆序输出的两种方法
- 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZde
- 把一个字符串里符合表情文字标签的地方全部替换为相应的图片的方法
- 编写一个方法,找出给定字符串的位置。
- 【JavaScript】面试题:重复输出一个给定的字符串
- 算法40(字符串的排列,给出一个函数来输出一个字符串的所有排列)
- php一个解析字符串排列数组的方法
- 3、给出一个函数输出字符串的所有排列
- 写一个方法,实现字符串的反转,如:输入abc,输出cba