我有一个类似“ 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是序列的长度。
0
2^n - 1
n
在您的情况下n为4,因此请考虑0 = 0000.. 15 = 1111; 那里有一个1在二进制表达式包括从序列中对应的项目。要实现这一点,您将需要移位和二进制操作:
0000
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(提示:考虑溢出和算术进位)。
int