2017-10-07 92 views
0

我有一個方法返回給定字符串中3個元素的所有可能的組合。將三個嵌套for循環嵌入遞歸

void FindAllCombinationsBy3(string &str, int start) 
{ 
    for (int i = 0; i < str.length() - 2; i++) 
    { 
     for (int j = i + 1; j < str.length() - 1; j++) 
     { 
      for (int k = j + 1; k < str.length(); k++) 
      { 
      cout << str[i] << str[j] << str[k] << endl; 
      } 
     } 
    } 

    return; 
} 

它工作正常,並輸出:abc abd abe abf acd ace acf ade。但我想寫一個遞歸版本的方法,它將接收組合長度的參數n。所以不只是3,而是一個自定義的長度。它應該看起來像這樣。但我在這種遞歸條件下迷失了。

void FindAllCombinationsByNValues(string &str, int start, int depth, int n) 
{ 
    if (depth++ >= n) 
    {  
     return; 
    } 

    for (int i = start; i < str.length() - n + depth; i++) 
    { 
     cout << str[i]; 
     FindAllCombinationsByNValues(str, start + 1, depth, n); 
    } 

    cout << endl; 
} 

我知道這被問了一百萬次,但其他解決方案還沒有幫助。

回答

1
void print_combinations(const std::string& s, unsigned n, unsigned j = 0, const std::string& a = "") { 
    if (n == 0) { 
    std::cout << a << std::endl; 
    } else { 
    for (auto i = j; i < s.length() - (n - 1); ++i) { 
     print_combinations(s, n - 1, i + 1, a + s[i]); 
    } 
    } 
} 

用法:

print_combinations("abcde", 3); 

輸出:

abc 
abd 
abe 
acd 
ace 
ade 
bcd 
bce 
bde 
cde 
+0

有人密我在某些時候,但didn't積累人物像你一樣。它有幫助 – earthQuake