说我有以下数组:让所有的组合阵列中的
var arr = new[] { "A", "B", "C" };
我怎么能生产出所有包含只有两个字符可能的组合,并没有两个相同的(例如AB
将是相同的BA
)。例如,使用上述阵列,它会生成:
AB
AC
BC
请注意,此示例已被简化。数组和所需字符串的长度将会更大。
我真的很感激,如果有人可以帮忙。
说我有以下数组:让所有的组合阵列中的
var arr = new[] { "A", "B", "C" };
我怎么能生产出所有包含只有两个字符可能的组合,并没有两个相同的(例如AB
将是相同的BA
)。例如,使用上述阵列,它会生成:
AB
AC
BC
请注意,此示例已被简化。数组和所需字符串的长度将会更大。
我真的很感激,如果有人可以帮忙。
让我们扩展它,所以也许我们可以看到的模式:
string[] arr = new string[] { "A", "B", "C", "D", "E" };
//arr[0] + arr[1] = AB
//arr[0] + arr[2] = AC
//arr[0] + arr[3] = AD
//arr[0] + arr[4] = AE
//arr[1] + arr[2] = BC
//arr[1] + arr[3] = BD
//arr[1] + arr[4] = BE
//arr[2] + arr[3] = CD
//arr[2] + arr[4] = CE
//arr[3] + arr[4] = DE
我在这里看到的两个循环。
现在应该很容易将它翻译成代码!
由于订货不要紧,这些实际上的组合,而不是排列。在任何情况下,有一些示例代码here(您想标题为“组合(即不重复)”。
你所寻找的是一个双环沿着下面的伪代码的行。
for(int i = FirstElement; i<= LastElement; increment i) {
for(j = i; j<= lastElement; increment j) {
if(i != j) {
print (i, j)
}
}
}
这是一个简单的组合。当组合的数量变得更大时,例如,来自26个字母的数组的10个字母组合(26个选择10个,不重复),您的代码将如何工作? – 2009-08-13 16:01:44
public string[] Permute(char[] characters)
{
List<string> strings = new List<string>();
for (int i = 0; i < characters.Length; i++)
{
for (int j = i + 1; j < characters.Length; j++)
{
strings.Add(new String(new char[] { characters[i], characters[j] }));
}
}
return strings.ToArray();
}
它的1到n-1或n之和(N-1)/ 2。
int num = n * (n - 1)/2;
显然,则可以将N *(N - 1)利用一对无论您尝试的是什么因素,要做(字符串大小明智)。
你所要求的是组合,而不是排列(后一项暗示订单很重要)。无论如何,这是递归的经典用法。在伪代码:
def combs(thearray, arraylen, currentindex, comblen):
# none if there aren't at least comblen items left,
# or comblen has gone <= 0
if comblen > arraylen - currentindex or comblen <= 0:
return
# just 1 if there exactly comblen items left
if comblen == arraylen - currentindex:
yield thearray[currentindex:]
return
# else, all combs with the current item...:
for acomb in combs(thearray, arraylen, currentindex+1, comblen-1):
yield thearray[currentindex] + acomb
# ...plus all combs without it:
for acomb in combs(thearray, arraylen, currentindex+1, comblen):
yield acomb
没有进行测试,而不是最快的,但:
IEnumerable<String> Combine(String text, IEnumerable<String> strings)
{
return strings.Select(s => text + s).Concat(Combine(strins.Take(1).First(), strings.Skip(1))
}
电话:
foreach (var s in Combine("" , arrayOfStrings))
{
// print s
}
写了一个问题的答案是竟然是标记为重复,指向这里。
var arr = new[] { "A", "B", "C" };
var arr2 = arr1.SelectMany(
x => arr1.Select(
y => x + y));
当在VS2013中枚举到控制台时产生正确的输出。 SelectMany
将展平从内部Select
生成的内部IEnumerable
。
你需要AB,AC,BC和ABC吗? – Kiquenet 2015-09-18 09:35:18