繁体   English   中英

从长度为 n 的字符数组生成长度为 m 的所有子序列,其中 n >= m 在 Java 语言中

[英]Generate all subsequences of length m from a character array of length n where n >= m in Java language

我在 Java 中寻找最佳代码,用于从长度为 n 的字符数组生成长度为 m 的所有子序列,其中 n >= m。

子序列的含义在这里: https://en.wikipedia.org/wiki/Subsequence

我当前的伪代码/算法如下。 但它看起来并没有优化。

if (m <= 0)
    return;
for (i = 0; i < 2^n; i++) { // can use BigInteger if n > 64
    j = numberOfBitsSet(i); // assuming numberOfBitsSet is implemented
    if (j == m) {
        s = "";
        while((index = getIndexOfNextBitSet(i)) >= 0) { // assuming getIndexOfNextBitSet is implemented
            s = s + charArray[index]; // bit numbering starts from zero
        } // end of while
        System.out.println(s);
    } // end of if
} // end of for

通常我在 C++ 中解决算法任务。 next_permutation有一个很酷的 function,它允许您随机播放序列的所有“排列”。 如果序列是“00110100”, next_permutation会给你“00111000”(以最佳方式)。

我在这里找到了 java 中相同 function 的示例实现。

这如何帮助您解决问题:用n - m个前导零后跟m个 1 初始化一个序列。 使用基于掩码的生成。 之后做next_permutation 该算法的复杂度为n * subsequence_count 如果您知道m遵循某些规则,这将是一个显着的改进,但如果 n = 64 和 m = 32 会再次触发大量结果。

暂无
暂无

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

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