排列组合算法封装2
来源:互联网 发布:网络执法官最新破解版 编辑:程序博客网 时间:2024/05/16 12:10
1.指定字符数组,从中抽取m个,组合,不重复
使用方法:
string str = "1234";//字符数组中抽取2个进行组合Extract extract = new Extract(str, 2);extract.OnCreateOneGroup += (e) =>{ Console.WriteLine(e);};extract.DoExtract();//字符数组中从1到当前数组个数的所有可能组合Extract extract = new Extract();extract.OnCreateOneGroup += (e) =>{ Console.WriteLine(e);};for (int i = 0; i < str.Length; i++){ extract.DoExtract(str, i + 1);}
类封装:
/// <summary>/// 从指定 字符数组中 抽取指定个数的组合/// 抽取结果组合,不重复,和排序无关/// </summary>public class Extract{ /// <summary> /// 当前需要排列着的数组 /// </summary> private char[] _Source = null; /// <summary> /// 从数组中获取的个数 /// </summary> private int _Count = 0; /// <summary> /// 当创建一个组合成功时,执行 /// </summary> public Action<string> OnCreateOneGroup; /// <summary> /// 初始化 /// </summary> public Extract() { } /// <summary> /// 初始化 /// </summary> /// <param name="Source">指定原数组</param> /// <param name="Count">抽取个数</param> public Extract(char[] Source, int Count) { this._Source = Source; _Count = Count; } /// <summary> /// 初始化 /// </summary> /// <param name="Source">字符串</param> /// <param name="Count">抽取个数</param> public Extract(string Source, int Count) { this._Source = Source.ToArray(); this._Count = Count; } /// <summary> /// 执行排列 /// </summary> public void DoExtract() { DoExtract(_Source, _Count); } /// <summary> /// 执行排列 /// </summary> /// <param name="source">源字符数组</param> /// <param name="count">排列的个数</param> public void DoExtract(char[] source, int count) { int[] result = new int[count]; int sourceCount = source.Length; combine(source, sourceCount, count, result, count); } /// <summary> /// 执行排列 /// </summary> /// <param name="source">源字符串</param> /// <param name="count">抽取个数</param> public void DoExtract(string source, int count) { DoExtract(source.ToArray(), count); } /// <summary> /// 获取的子集合 出现的所有项不会重复,跟子集合的排列顺序没有关系 /// </summary> private void combine(char[] a, int n, int m, int[] b, int M) { for (int i = n; i >= m; i--)//注意这里的循环范围 { b[m - 1] = i - 1; if (m > 1) combine(a, i - 1, m - 1, b, M); else { StringBuilder builder = new StringBuilder(100); for (int j = M - 1; j >= 0; j--) { char item = a[b[j]]; builder.Append(item); } //创建一组完成 if (OnCreateOneGroup != null) { OnCreateOneGroup(builder.ToString()); } } } }}
0 0
- 排列组合算法封装2
- 排列组合算法(位移)2
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- java编写的轻量级HTTP服务器nanohttpd
- 【leetcode】Search in Rotated Sorted Array
- tomcat下域名的配置及ROOT.xml
- Delphi之接口
- 算法——TOP K问题最小堆实现扩展
- 排列组合算法封装2
- iOS本地通知
- Java容器深入研究(jdk 1.8)--- ArrayList总结与源码分析
- 【第九章】 Spring的事务 之 9.2 事务管理器 ——跟我学spring3
- 利用 BitmapShader 制作自带边框圆形头像
- 欢迎使用CSDN-markdown编辑器
- [SQL SERVER系列]存储过程,游标和触发器实例[原创]
- 翻翻git之---足以取代底部PoPupWindows的强大控件 BottomSheet
- [SQL SERVER系列]工作经常使用的SQL整理,实战篇(三)[原创]