一尘不染

产生子序列

algorithm

我有一个类似“ 0189”的字符串,我需要为其生成所有子序列,但是必须保留各个字符的顺序,即此处9不应位于0、1或8之前。例如:0、018、01
,09、0189、18、19、019等。

另一个示例是“ 10292”,其子序列为:1、10、02、02、09、29、92等。您可能已经两次注意到“ 02”,因为“
2”在给定字符串中出现两次。但同样,诸如21、01、91之类的东西将无效,因为要保持顺序。

可以在C / C ++中实现的任何算法或伪代码将不胜感激!


阅读 300

收藏
2020-07-28

共1个答案

一尘不染

我建议使用序列的 幂集 和从0到的二进制数
之间的自然对应关系2^n - 1,其中n是序列的长度。

在您的情况下n为4,因此请考虑0 = 0000.. 15 = 1111;
那里有一个1在二进制表达式包括从序列中对应的项目。要实现这一点,您将需要移位和二进制操作:

for (int i = 0; i < (1 << n); ++i) {
    std::string item;
    for (j = 0; j < n; ++j) {
        if (i & (1 << j)) {
            item += sequence[j];
        }
    }
    result.push_back(item);
}

还要考虑如何处理序列,使其长度超过一个覆盖的范围int(提示:考虑溢出和算术进位)。

2020-07-28