none
求组合字符串生成的方法? RRS feed

  • 问题

  • string str="a,b,c,d,E,F,G";

    如规则是:小写字母取三个,大写字母取两个。

    生成如下字符串:

    ---------------------------------------------------------

    a,b,c,E,F
    a,b,c,E,G
    a,b,c,F,G

    a,b,d,E,F
    a,b,d,E,G
    a,b,d,F,G

    a,c,d,E,F
    a,c,d,E,G
    a,c,d,F,G

    b,c,d,E,F
    b,c,d,E,G
    b,c,d,F,G

    -----------------------------------------------------

    现在使用的方法是split(,)

    然后找出大写小写字母分别放入maxArray[],minArray[]

    然后 for( for(for (for( for(   ))))) ,

    效率慢不说,而且

    这样无法应对小写字母和大写字母个数变动的情况,大小写字母N(N>=3)

    那么,多少层for for for ...for....就实现不了。

    向各位大哥大姐小弟小妹求教,有没有好的方法救兄弟于水火啊?

    谢谢先啊!




    2014年10月9日 10:53

答案

  • 你好:

    这其实是算法的问题,跟C#语言本身关系不大。如果你在搜索引擎里面搜“M个不同字符中任取N个字符的所有组合”,你会发现很多答案。我从里面挑了一个java的代码片段,修改成了C#方法,测试了一下应该是可以满足需要的。参考一下:

    class Program
        {
            static void Main()
            {
                int n = 3;
                string srcStr = "ABCDE";
                char[] result = new char[n];
    
                int a = result[1];
    
                if (n > 0 && srcStr.Length > 0 && n <= srcStr.Length)
                    Find(srcStr, ref result, n);
    
                Console.Read();
            }
    
            //组合问题(从M个不同字符中任取N个字符的所有组合)
            static void Find(string source, ref char[] result, int n)
            {
                string temp = "";
                char[] arr = source.ToArray();
                if (n == 1)
                {
                    int i = 0;
                    while (i < arr.Length)
                    {//进入这里 表明只剩最后一位没有确定
                        result[result.Length - 1] = arr[i++];//如果是任意取一个元素  就等于是全部输出
                        Console.WriteLine(result);
                    }
                }
                else
                {
                    int i = arr.Length, j, k = 0;
                    for (j = 0; result[j] != 0; j++) ;
                    //将指针向后移动 直到移动至result[j]==0 表示指针此时在已有数据的最后面
                    //{x,x,x,x,x,x,0,0,0,0,0} 元素是一个一个在最后加上的  所以要找到末尾元素后第一个空位
    
    
                    //一开始 n=3  那么这里执行2次 n就是1 所以先去除了AB 然后剩余的是CDE 
                    //组成了 ABC ABD ABE
                    //接下来是 AC 还剩DE
                    for (; i >= n; i--)
                    {
                        result[j] = arr[k++];//向result[]数组中添加数据 
                        result[j + 1] = '\0';
                        temp = source.Substring(k);
                        Find(temp, ref result, n - 1);//substring(int k)截取k~end下标的字串 
                    }
                }
    
            }
        }


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年10月10日 7:17
    版主

全部回复

  • 你好:

    这其实是算法的问题,跟C#语言本身关系不大。如果你在搜索引擎里面搜“M个不同字符中任取N个字符的所有组合”,你会发现很多答案。我从里面挑了一个java的代码片段,修改成了C#方法,测试了一下应该是可以满足需要的。参考一下:

    class Program
        {
            static void Main()
            {
                int n = 3;
                string srcStr = "ABCDE";
                char[] result = new char[n];
    
                int a = result[1];
    
                if (n > 0 && srcStr.Length > 0 && n <= srcStr.Length)
                    Find(srcStr, ref result, n);
    
                Console.Read();
            }
    
            //组合问题(从M个不同字符中任取N个字符的所有组合)
            static void Find(string source, ref char[] result, int n)
            {
                string temp = "";
                char[] arr = source.ToArray();
                if (n == 1)
                {
                    int i = 0;
                    while (i < arr.Length)
                    {//进入这里 表明只剩最后一位没有确定
                        result[result.Length - 1] = arr[i++];//如果是任意取一个元素  就等于是全部输出
                        Console.WriteLine(result);
                    }
                }
                else
                {
                    int i = arr.Length, j, k = 0;
                    for (j = 0; result[j] != 0; j++) ;
                    //将指针向后移动 直到移动至result[j]==0 表示指针此时在已有数据的最后面
                    //{x,x,x,x,x,x,0,0,0,0,0} 元素是一个一个在最后加上的  所以要找到末尾元素后第一个空位
    
    
                    //一开始 n=3  那么这里执行2次 n就是1 所以先去除了AB 然后剩余的是CDE 
                    //组成了 ABC ABD ABE
                    //接下来是 AC 还剩DE
                    for (; i >= n; i--)
                    {
                        result[j] = arr[k++];//向result[]数组中添加数据 
                        result[j + 1] = '\0';
                        temp = source.Substring(k);
                        Find(temp, ref result, n - 1);//substring(int k)截取k~end下标的字串 
                    }
                }
    
            }
        }


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年10月10日 7:17
    版主
  • 谢谢。

    我是在论坛中没找到有关算法的子论坛。所以,只好到这个子论坛提问了。

    回去试试。

    再次感谢。

    2014年10月10日 10:38