关于排列组合的一个函数,该如何处理
关于排列组合的一个函数
写个函数f,
f("abc", 2)
aa
ab
ba
bb
f("ab", 3)
aaa
aab
aba
abb
baa
bab
bba
bbb
f("abcde",5)
aaaaa
aaaab
.....
我不太清楚这个是不是全排列还是叫别的啥
要求不用递归,栈、链表等,可以用数组
------解决方案--------------------
------解决方案--------------------
其实是数字的进制问题:
输出所有小于等于n位的p进制数,其中p为输入字符串的长度。用输入字符串中的各位字符代替数字。
简单写了个:
写个函数f,
f("abc", 2)
aa
ab
ba
bb
f("ab", 3)
aaa
aab
aba
abb
baa
bab
bba
bbb
f("abcde",5)
aaaaa
aaaab
.....
我不太清楚这个是不是全排列还是叫别的啥
要求不用递归,栈、链表等,可以用数组
------解决方案--------------------
------解决方案--------------------
其实是数字的进制问题:
输出所有小于等于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; } }