2009-08-13 62 views
8

說我有以下數組:讓所有的組合陣列中的

var arr = new[] { "A", "B", "C" }; 

我怎麼能生產出所有包含只有兩個字符可能的組合,並沒有兩個相同的(例如AB將是相同的BA)。例如,使用上述陣列,它會生成:

AB 
AC 
BC 

請注意,此示例已被簡化。數組和所需字符串的長度將會更大。

我真的很感激,如果有人可以幫忙。

+0

你需要AB,AC,BC和ABC嗎? – Kiquenet 2015-09-18 09:35:18

回答

5

讓我們擴展它,所以也許我們可以看到的模式:

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 

我在這裏看到的兩個循環。

  • 第一(外)環從0到3(arr.Length - 1)
  • 第二(內)循環從外循環計數器變爲+ 1至4(arr.Length)

現在應該很容易將它翻譯成代碼!

1

由於訂貨不要緊,這些實際上的組合,而不是排列。在任何情況下,有一些示例代碼here(您想標題爲「組合(即不重複)」。

-1

你所尋找的是一個雙環沿着下面的僞代碼的行。

for(int i = FirstElement; i<= LastElement; increment i) { 
    for(j = i; j<= lastElement; increment j) { 
     if(i != j) { 
      print (i, j) 
     } 
    } 
} 
+2

這是一個簡單的組合。當組合的數量變得更大時,例如,來自26個字母的數組的10個字母組合(26個選擇10個,不重複),您的代碼將如何工作? – 2009-08-13 16:01:44

0
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(); 
} 
0

它的1到n-1或n之和(N-1)/ 2。

int num = n * (n - 1)/2; 

顯然,則可以將N *(N - 1)利用一對無論您嘗試的是什麼因素,要做(字符串大小明智)。

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 
0

沒有進行測試,而不是最快的,但:

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 
} 
0

寫了一個問題的答案是竟然是標記爲重複,指向這裏。

var arr = new[] { "A", "B", "C" }; 

var arr2 = arr1.SelectMany(
    x => arr1.Select(
     y => x + y)); 

當在VS2013中枚舉到控制檯時產生正確的輸出。 SelectMany將展平從內部Select生成的內部IEnumerable