排列组合算法封装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
原创粉丝点击