繁体   English   中英

获得所有组合,无需重复

[英]Get all combinations without duplicates

在c ++中给出所有可能的字符串组合,没有重复。 输入示例:“123”和输出组合将是:

 1,12,123,13,2,23,3.

复制的一个例子是“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;
}

这是一个面试问题,没有重复的事情让我感动。 在此先感谢您的帮助。

OP正在寻找的是相当于Power Set减去空集 无需递归即可轻松实现所需的输出。 这是一个简单的方法:

#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;
}

这是输出:

Please enter a string : 123
Here is your output : 1 2 12 3 13 23 123

说明:

我们首先注意到幂集的大小由2^n给出,其中n是初始集的大小。 出于我们的目的,我们的最终向量将只包含2^n - 1元素,但是我们仍然需要保留2^n以防止调整大小,因为构造我们的结果需要“空”元素。

真正的工作是在GetPowerSet中间的两个for loops中执行的。 我们从一个空白元素开始。 然后,我们迭代原始矢量中的每个字符,沿途创建我们的电源集的子集。 例如

  1. 使用空集初始化功率集: powerSet = {}
  2. v的第一个元素添加到上面的幂集的每个元素: '' + '1' = '1'
    • powerSet = {{}, '1'}
  3. v的第二个元素添加到上面的幂集的每个元素: '' + '2' = '2', '1' + '2' = '12'
    • powerSet = {{}, '1', '2', '12'}
  4. v的第三个元素添加到上面的幂集的每个元素: '' + '3' = '3', '1' + '3' = '13', '2' + '3' = '23', '12' + '3' = '123'
    • powerSet = {{}, '1', '2', '12', '3', '13', '23', '123'}
  5. 现在删除上面电源组中的第一个元素。
    • 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM