产生子序列
问题内容:
我有一个类似“ 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 ++中实现的任何算法或伪代码将不胜感激!
问题答案:
我建议使用序列的 幂集 和从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
(提示:考虑溢出和算术进位)。