字符全排列
来源:互联网 发布:淘宝玩乐收藏类目 编辑:程序博客网 时间:2024/06/06 07:54
1.递归实现无重复字符的全排列
输入一个字符串,打印出该字符串中字符的所有排列。
例如输入字符串abc,则打印abc,acb,bac,bca,cba,cab
分析
全排列主要分为两个步骤:(1)将各个字符依次与第一个字符交换;(2)固定第一个字符,对后面的字符进行全排列。
代码
#include <stdio.h>void Swap(char* input, int i, int j){ int temp; temp = input[i]; input[i] = input[j]; input[j] = temp;}void AllPermutation(char* input, int length, int index){ if (input == NULL || length <= 0) return; if (index >= length) { for(int i = 0; i < length; i++) { printf("%c ", input[i]); } printf("\n"); } for (int i = index; i < length; i++) { Swap(input ,i, index); AllPermutation(input, length, index + 1); Swap(input ,i, index); }}int main(){ char arr[] = {'a','b','c'}; int length = sizeof(arr)/sizeof(arr[0]); char* input = arr; AllPermutation(input, length, 0); return 0;}
2.递归实现重复字符的全排列
分析
与不重复字符串的全排列相比,重复字符串的全排列只需要和不重复字符交换即可,也就是在交换前加上一个是否是重复字符的判断。
3.非递归实现无重复字符的全排列
分析
为了非递归实现全排列,我们就需要找到前、后两个排列的关系,即找“规律”。为了更加直观地说明这种“规律”,我们以数字1, 2, 3, 4代替字符a, b, c, d:
代码
#include <stdio.h>/** * 交换两个字符 */void Swap(char* input, int i, int j){ int temp; temp = input[i]; input[i] = input[j]; input[j] = temp;}/** * 寻找替换点 */int Substitution(char* input, int length){ for (int i = length - 1; i > 0; i--) { if (input[i] > input[i - 1]) { return i - 1; } } return -1;}/** * 反转替换点后面的序列 */void Reserve(char* input, int start, int end){ if (start < 0 || end < 0 || start == end) { return; } while (start < end) { Swap(input, start++, end--); }}/** * 寻找比替换点大的最小数 */int FindMin(char* input, int index, int start, int end){ char substitution = input[index]; char min = input[start]; int minindex = -1; for (int i = start; i <= end; i++) { if (input[i] > substitution) { if (input[i] <= min) { min = input[i]; minindex = i; } } } return minindex;}/** * 全排列非递归实现 */void AllPermutation(char* input, int length){ if (input == NULL || length <=0) { return; } for (;;) { //打印 for(int i = 0; i < length; i++) { printf("%c ", input[i]); } printf("\n"); //找出替换点 int index = Substitution(input, length); //找不到替换点则退出 if (index < 0) { break; } //找出比替换点大的最小值 int minindex = FindMin(input, index, index + 1, length - 1); //交换替换点和比它大的最小值 Swap(input, index, minindex); //反转替换点后面的序列 Reserve(input, index + 1, length - 1); }} int main(){ char arr[] = {'a','b','c'}; int length = sizeof(arr)/sizeof(arr[0]); char* input = arr; AllPermutation(input, length); return 0;}
阅读全文
0 0
- 字符的全排列
- 字符全排列
- 字符全排列Permutation
- 字符全排列
- 字符全排列算法
- 字符全排列产生器
- 字符的全排列
- 字符全排列
- 字符全排列
- 字符的全排列
- 字符全排列
- 四个字符全排列
- 字符的全排列
- 字符全排列
- 字母字符全排列
- 计蒜客-字符全排列
- dfs-字符全排列
- 算法题--字符排列(全排列)
- 【Linux】安装Mysql,Navicat以及MySQLdb
- Struts2的执行流程
- 找不到windows.h源文件
- cocos2dx游戏资源加密之XXTEA
- 快速排序
- 字符全排列
- OpenCV编译、安装、测试
- Unity打印简单图形
- OCLint的部分规则(Unuseed 部分)
- Dubbo调用过程监控
- Hash Collision DoS
- dom4j 解析xml文件(涉及知识点:dom4j,XPath,递归)
- 在linux下通过zookeeper部署solr集群详细配置教程
- 介绍几个工具