• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

(转)一维字符串数组之间组合问题的C#实现

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

如题,最近需要处理一些字符串数组之间相互无重组合的实际问题。
把问题抽象出来,实际就是数学中的排列组合问题,思想很简单,只是在实现上着实花了一些功夫,而且代码尚需进一步优化,写下来希望能和大家一起探讨,欢迎大家提建议,以使程序能进一步优化。
问题描述:
假设现有三组字符,如下
{k1,k2},
{k3,k4},
{k5}
要求三组数据组合,组合的每一个结果必须包含三组中的字符,且不重复。
针对这种少量的数组,通过排列组合我们可以计算出组合数量
N = 2*2*1 = 4 (种)
结果如下:
k5k3k1
k5k4k1
k5k3k2
k5k4k2
思想很简单的,我实际问题抽象成了二维数组,实际就是一维数组中n个一维数组的组合问题。
但是在使用C#实现时,走了不少弯路,个人觉得代码冗长了,需要改善的地方很多,
我想集众人的智慧肯定能获得一个更加精悍、性能更优的代码!
这里直接是建的控制台应用程序 
程序如下(关键之处程序中已加注释):

 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace testString
{
    /// <summary>
    /// 一维数组之间组合问题的C#实现
    /// Author:Lucky Hu
    /// Date:2012-05-08
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            //构造一个二维数组
            Dictionary<string, string> dk = new Dictionary<string, string>();
            dk.Add("k1", "A");
            dk.Add("k2", "A");
            dk.Add("k3", "B");
            dk.Add("k4", "B");
            dk.Add("k5", "C");
            //dk.Add("k6", "C");
            //dk.Add("k7", "D");
            //dk.Add("k8", "D");
            //dk.Add("k9", "E");
            List<string> s3 = new List<string>();
            List<List<string>> s2 = new List<List<string>>();
            foreach (var k in dk)
            {
                Console.WriteLine("Key:{0},Value:{1}", k.Key, k.Value);
                string keys = "";
                var key_by_value = dk.Where(p => p.Value == k.Value).Select(p => p.Key);
                List<string> dd = new List<string>();
                foreach (var key in key_by_value)
                {
                    keys += "," + key;
                }
                string newkeys = keys.Remove(0, 1);
                if (s3.Contains(newkeys) == false)
                {
                    s3.Add(newkeys);
                }
            }
            foreach (var v in s3)
            {
                string[] split = new string[100];//全局
                if (v.Contains(","))
                {
                    //含逗号
                    split = v.Split(new char[] { ',' });
                }
                else
                {
                    //不含逗号
                    split[0] = v;
                }
                List<string> newSplit = new List<string>();
                //////////////因为C#不自带获取数组真实长度的函数,暂时没有想到更好的办法了
                for (int n = 0; n < split.Length; n++)
                {
                    if (split[n] != null)
                    {
                        newSplit.Add(split[n]);
                    }
                }

                List<string> s4 = new List<string>();
                for (int i = 0; i < newSplit.Count; i++)
                {
                    //s4.Add(split[i]);
                    s4.Add(newSplit[i]);
                }
                s2.Add(s4);//构造数组结束
            }
            List<List<string>> res = new List<List<string>>();
            res = combine(s2, 0);
            Console.WriteLine("组合结果:");
            foreach (var r in res)
            {
                foreach (var rr in r)
                {
                    Console.WriteLine(rr);
                }
            }
            Console.ReadKey();
        }
        /// <summary>
        /// 组合函数(递归)
        /// </summary>
        /// <param name="a">一个二维数组</param>
        /// <param name="idx">索引</param>
        /// <returns>返回一个二维数组</returns>
        public static List<List<string>> combine(List<List<string>> a, int idx)
        {
            List<List<string>> b = new List<List<string>>();
            List<List<string>> s = new List<List<string>>();
            if (idx >= (a.Count) - 1)
            {
                s.Add(a[idx]);
                return s;
            }
            else
            {
                List<List<string>> low_b = combine(a, idx + 1);
                foreach (var ch in a[idx])
                {
                    foreach (var low_arr in low_b)
                    {
                        foreach (var tt in low_arr)
                        {
                            string t = "";
                            t += (tt + ch);
                            List<string> s5 = new List<string>();
                            s5.Add(t);
                            b.Add(s5);
                        }
                    }
                }
            }
            return b;
        }
    }
}

 

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap