获得所有不重复的组合 给出C++中没有重复的字符串的所有可能组合。 示例输入:“123”和输出组合为: 1,12,123,13,2,23,3.

获得所有不重复的组合 给出C++中没有重复的字符串的所有可能组合。 示例输入:“123”和输出组合为: 1,12,123,13,2,23,3.,c++,recursion,combinations,C++,Recursion,Combinations,重复的示例为“12”==“21”或“123”==“213” 假设一个字符不会被多次使用。我也不认为递归是强制性的 这里有一个php答案 我考虑过某种形式的结果树,但不确定如何用递归实现 我的答案(包括副本)如下: #include <string> #include <iostream> using namespace std; void get( string str, string res ) { cout << res << end

重复的示例为“12”==“21”或“123”==“213”

假设一个字符不会被多次使用。我也不认为递归是强制性的

这里有一个php答案

我考虑过某种形式的结果树,但不确定如何用递归实现

我的答案(包括副本)如下:

#include <string>
#include <iostream>
using namespace std;

void get( string str, string res ) {

   cout << res << endl;

   for( int i = 0; i < str.length(); i++ )
      get( string(str).erase(i,1), res + str[i] );
}

int main( int argc, char **argv) {
   string str = "123";
   get( str, "" );
   return 0;
}
#包括
#包括
使用名称空间std;
void get(字符串str、字符串res){

coutOP所寻找的等于减去。无需递归即可轻松获得所需的输出。以下是一种简单的方法:

#include <vector>
#include <string>
#include <cmath>
#include <iostream>

void GetPowerSet(std::string v) {

    std::string emptyString;
    std::vector<std::string> powerSet;
    int n = (int) std::pow(2.0, (double) v.size()); // Get size of power set of v
    powerSet.reserve(n);
    powerSet.push_back(emptyString); // add empty set

    for (std::string::iterator it = v.begin(); it < v.end(); it++) {
        unsigned int tempSize = powerSet.size();
        for (std::size_t j = 0; j < tempSize; j++)
            powerSet.push_back(powerSet[j] + *it);
    }

    // remove empty set element
    powerSet.erase(powerSet.begin());

    // print out results
    std::cout << "Here is your output : ";
    for (std::vector<std::string>::iterator it = powerSet.begin(); it < powerSet.end(); it++)
        std::cout << *it << ' ';
}

int main() {
    std::string myStr;
    std::cout << "Please enter a string : ";
    std::cin >> myStr;
    GetPowerSet(myStr);
    return 0;
}
说明: 我们首先注意到幂集的大小由
2^n
给出,其中
n
是初始集的大小。出于我们的目的,我们的最终向量将只包含
2^n-1
元素,但是我们仍然需要保留
2^n
,以防止大小调整为“空”元素来构造我们的结果

实际工作是在<<代码>循环< <代码> >代码<> GoPixStuts中。我们从一个空白元素开始。然后在我们的原始向量中的每个字符中迭代遍历我们的幂集的子集。

  • 使用空集初始化电源集:
    powerSet={}
  • v
    的第一个元素添加到上述电源组的每个元素:
    '+'1'='1'
    • powerSet={{},'1'}
  • v
    的第二个元素添加到上述电源组的每个元素:
    '+'2'='2','1'+'2'='12'
    • powerSet={{},'1','2','12'}
  • v
    的第三个元素添加到上述幂集合的每个元素:
    '+'3'='3','1'+'3'='13','2'+'3'='23','12'+'3'='123'
    • powerSet={{{},'1','2','12','3','13','23','123'}
  • 现在移除上面电源组中的第一个元件。
    • powerSet={'1','2','12','3','13','23','123'}

  • 我们完成了。

    OP所寻找的等价于减去。无需递归即可轻松实现所需的输出。以下是一种简单的方法:

    #include <vector>
    #include <string>
    #include <cmath>
    #include <iostream>
    
    void GetPowerSet(std::string v) {
    
        std::string emptyString;
        std::vector<std::string> powerSet;
        int n = (int) std::pow(2.0, (double) v.size()); // Get size of power set of v
        powerSet.reserve(n);
        powerSet.push_back(emptyString); // add empty set
    
        for (std::string::iterator it = v.begin(); it < v.end(); it++) {
            unsigned int tempSize = powerSet.size();
            for (std::size_t j = 0; j < tempSize; j++)
                powerSet.push_back(powerSet[j] + *it);
        }
    
        // remove empty set element
        powerSet.erase(powerSet.begin());
    
        // print out results
        std::cout << "Here is your output : ";
        for (std::vector<std::string>::iterator it = powerSet.begin(); it < powerSet.end(); it++)
            std::cout << *it << ' ';
    }
    
    int main() {
        std::string myStr;
        std::cout << "Please enter a string : ";
        std::cin >> myStr;
        GetPowerSet(myStr);
        return 0;
    }
    
    说明: 我们首先注意到幂集的大小由
    2^n
    给出,其中
    n
    是初始集的大小。出于我们的目的,我们的最终向量将只包含
    2^n-1
    元素,但是我们仍然需要保留
    2^n
    ,以防止大小调整为“空”元素来构造我们的结果

    实际工作是在<<代码>循环< <代码> >代码<> GoPixStuts中。我们从一个空白元素开始。然后在我们的原始向量中的每个字符中迭代遍历我们的幂集的子集。

  • 使用空集初始化电源集:
    powerSet={}
  • v
    的第一个元素添加到上述电源组的每个元素:
    '+'1'='1'
    • powerSet={{},'1'}
  • v
    的第二个元素添加到上述电源组的每个元素:
    '+'2'='2','1'+'2'='12'
    • powerSet={{},'1','2','12'}
  • v
    的第三个元素添加到上述幂集合的每个元素:
    '+'3'='3','1'+'3'='13','2'+'3'='23','12'+'3'='123'
    • powerSet={{{},'1','2','12','3','13','23','123'}
  • 现在移除上面电源组中的第一个元件。
    • powerSet={'1','2','12','3','13','23','123'}

  • 我们完成了。

    认为我应该在评论中添加@Caninonos的答案。我只是稍微简化了它,删除了模板等。这是一个递归解决方案

    #include <iostream>
    #include <vector>
    using namespace std;
    
    void get_substrings_aux(vector<string>& subs, string str ,unsigned int cnt) {
    
        if(cnt == str.size())
        return;
    
        int n = subs.size();
        char c = str[cnt];
        for(int i = 0 ; i < n ; ++i) {
            subs.push_back(subs[i] + c);
            cout << subs[i] + c << endl;
        }
        get_substrings_aux(subs, str, ++cnt);
    }
    
    vector<string> get_substrings(const string& str) {
        vector<string> subs(1);
        int cnt=0;
        get_substrings_aux(subs, str, cnt);
        subs.erase(subs.begin());
        return subs;
    }
    
    int main() {
        string str("1234");
        vector<string> subs = get_substrings(str);
        return 0;
    }
    
    #包括
    #包括
    使用名称空间std;
    void get_substring_aux(向量和subs、字符串str、无符号int-cnt){
    如果(cnt==str.size())
    回来
    int n=subs.size();
    字符c=str[cnt];
    对于(int i=0;icout认为我应该在评论中添加@Caninonos的答案。我只是稍微简化了它,删除了模板等。这是一个递归解决方案

    #include <iostream>
    #include <vector>
    using namespace std;
    
    void get_substrings_aux(vector<string>& subs, string str ,unsigned int cnt) {
    
        if(cnt == str.size())
        return;
    
        int n = subs.size();
        char c = str[cnt];
        for(int i = 0 ; i < n ; ++i) {
            subs.push_back(subs[i] + c);
            cout << subs[i] + c << endl;
        }
        get_substrings_aux(subs, str, ++cnt);
    }
    
    vector<string> get_substrings(const string& str) {
        vector<string> subs(1);
        int cnt=0;
        get_substrings_aux(subs, str, cnt);
        subs.erase(subs.begin());
        return subs;
    }
    
    int main() {
        string str("1234");
        vector<string> subs = get_substrings(str);
        return 0;
    }
    
    #包括
    #包括
    使用名称空间std;
    void get_substring_aux(向量和subs、字符串str、无符号int-cnt){
    如果(cnt==str.size())
    回来
    int n=subs.size();
    字符c=str[cnt];
    对于(int i=0;i您可能正在寻找吗?输入是否不应该包含两次相同的字符?(例如,“aab”,您是否认为不会发生这种情况,您是否必须检测到它并发出错误信号,您是否输出“a,b,ab,aa,aab”?)@JesperJuhl我认为这不是他想要的。他不想要排列,他想要所有可能的字符串,可以通过从原始字符串中删除字母来获得。@Caninonos,我认为更容易假设同一个字符不会被使用两次。那么有一个有点幼稚的解决方案:你可能在寻找吗?inp是吗ut不应包含同一字符两次?(例如,“aab”,您是否认为不会发生这种情况,您是否必须检测它并发出错误信号,您是否输出“a,b,ab,aa,aab”?)@JesperJuhl我不认为这是他想要的。他不想要排列,他想要所有可能的字符串,可以通过从原始字符串中删除字母来获得。@Caninonos,我认为更容易假设同一个字符不会被使用两次。那么有一个有点天真的解决方案:这太好了,谢谢!几乎就像二进制计数,这就是我想要得到的