日期:2014-05-17  浏览次数:20939 次

关于排列组合的一个函数
写个函数f,

f("abc", 2)
aa
ab
ba
bb


f("ab", 3)
aaa
aab
aba
abb
baa
bab
bba
bbb

f("abcde",5)
aaaaa
aaaab
.....
我不太清楚这个是不是全排列还是叫别的啥
要求不用递归,栈、链表等,可以用数组


------解决方案--------------------
探讨
写个函数f,

f("abc", 2)
aa
ab
ba
bb


------解决方案--------------------
其实是数字的进制问题:
输出所有小于等于n位的p进制数,其中p为输入字符串的长度。用输入字符串中的各位字符代替数字。
简单写了个:
C# code

string[] GetStrings(string baseStr, int count)
        {
            char[] baseChars = baseStr.ToCharArray();
            int b = baseStr.Length;
            int retLen = 0, i = 0;
            try
            {
                retLen = (int)Math.Pow(b, count);
            }
            catch
            {
                throw new ArgumentOutOfRangeException("count");
            }
            string[] results = new string[retLen];
            int[] baseArr = new int[count];
            for (i = 0; i < count; i++) baseArr[i] = 0;        //初始化
            for (i = 0; i < retLen; i++)
            {
                results[i] = new string(baseArr.Select(x => baseChars[x]).ToArray());    //构建字符串
                baseArr[count - 1] += 1;    //加1
                for (int j = count - 1; j > 0; j--)        //进位
                {
                    if (baseArr[j] >= b)
                    {
                        baseArr[j - 1]++;
                        baseArr[j] = 0;
                    }
                }
            }
            return results;
        }

------解决方案--------------------
http://topic.csdn.net/u/20090217/21/F41ED9F6-F929-451C-A5C9-80D2E408422A.html
------解决方案--------------------
C# code


    class Program
    {
        static void Main(string[] args)
        {
            Comb("abc", 3).ToList().ForEach(Console.WriteLine);
        }

        private static string Tr(string str, int n)
        {
            string s = "";
            int len = str.Length;
            while (n >= 0)
            {
                s = str[n % len] + s;
                n = n / len - 1;
            }
            return s;
        }

        private static IEnumerable<string> Comb(string str, int n)
        {
            int x = str.Length;
            int leng = (int)Math.Pow(x, n);
            var sArr = new string[leng];
            int t = ((int)(Math.Pow(x, n) - x) / (x - 1));
            for (int i = t; i < t + leng; i++)
            {
                sArr[i - t] = Tr(str, i);
            }
            return sArr;
        }
    }