首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于排列组合的一个函数,该如何处理

2012-11-05 
关于排列组合的一个函数写个函数f,f(abc, 2)aaabbabbf(ab, 3)aaaaababaabbbaababbbabbbf(abcde,5)aa

关于排列组合的一个函数
写个函数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;        }    } 

热点排行