字符串或数组全排列的三种方法
来源:互联网 发布:梦幻古龙服务端源码 编辑:程序博客网 时间:2024/06/05 08:58
先看最简单的一种:
void perm2(int *arr, int n, int len){ for (int i = 0; i < len; i++) { for (int j = 0; j < len; j++) { for (int k = 0; k < len; k++) { if ((i != k) && (i != j) && (j != k)) { cout <<arr[i] <<arr[j] << arr[k]<<endl; } } } }}int main(){ int arr[] = { 1, 2, 3}; int len = sizeof(arr) / sizeof(arr[0]); perm2(arr,0,len); system("pause");}
另一种:递归,用一个数组标记数字是否被用过
#include<iostream>using namespace std;#define N 3int used[N] = { 0 };//标记int num[N];//结果int mat[N] = { 1, 2, 3};//原来的数据void shown(int ceng){ if (ceng >= N) { for (int i = 0; i < N; i++) { printf("%4d", num[i]); } printf("\n");//显示数据 } else { for (int i = 0; i < N; i++) { if (!used[i]) { used[i] = 1;//代表用过 num[ceng] = mat[i];//写入结果 shown(ceng + 1); used[i] = 0;//用完了 } } }}int main(){ shown(0); cout << coun << endl; system("pause"); return 0;}
1.先将当前字符串打印出来
2.将倒数第二个字符后移
3.将字符串打印出来
4.倒数第三个字符调用上过程
5.第一个字符调用以上过程
#include<iostream>using namespace std;void perm1(int *arr, int n,int len){ if (n ==len) { for (int i = 0; i < len; i++) { cout << arr[i] << " "; } cout << endl; } else { for (int pInt = n; pInt < len; pInt++) { swap(arr[n], arr[pInt]); perm1(arr, n + 1, len); swap(arr[n], arr[pInt]); } }}int main(){ int arr[] = { 1, 2, 3}; int len = sizeof(arr) / sizeof(arr[0]); perm2(arr,0,len); cout << coun << endl; system("pause");}
0 0
- 字符串或数组全排列的三种方法
- 字符串算法——数组或字符串全排列(Permutations)
- 字符串算法——有重复字符的数组或字符串全排列(Permutations II)
- 字符串反序排列的三种方法
- 字符串、数组的全排列问题
- 输出数组的全排列方法
- 字符串数组的全排列——数组
- 数组的全排列
- 数组的全排列
- 数组的全排列
- 数组的全排列
- 数组的全排列
- 数组的全排列
- 数组的全排列
- 数组的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 登山
- 2017/4/15 Twosat介绍
- github上传本地代码失败
- java中泛型有什么用,举例说明?
- LeetCode065 Valid Number
- 字符串或数组全排列的三种方法
- 二分查找的递归实现
- 求1/2
- LeetCode066 Plus One
- Android 各部布局
- 【HTML5学习笔记】1:工具的使用和基本格式
- Fragment中调用getActivity为null的问题
- Android中drawableStart和drawableLeft的区别
- 将字符串中的中文数字转换成阿拉伯数字