gpt4 book ai didi

java - 如何获取字符串的所有子序列组合(在 Java 或 C++ 等中)

转载 作者:IT老高 更新时间:2023-10-28 20:55:13 25 4
gpt4 key购买 nike

假设我有一个字符串“12345”,我应该获得这个字符串的所有子序列组合,例如:

  1. --> 1 2 3 4 5
  2. --> 12 13 14 15 23 24 25 34 35 45
  3. --> 123 124 125 234 235 345
  4. --> 1234 1235 1245 1345 2345
  5. --> 12345

请注意,我将它们分组为不同数量的字符,但没有更改它们的顺序。我需要一个方法/函数来做到这一点。

最佳答案

你想要一个powerset。以下是 StackOverflow 上所有提到 powersets 的问题或 power sets .

这是python中的一个基本实现:

def powerset(s):
n = len(s)
masks = [1<<j for j in xrange(n)]
for i in xrange(2**n):
yield [s[j] for j in range(n) if (masks[j] & i)]


if __name__ == '__main__':
for elem in powerset([1,2,3,4,5]):
print elem

这是它的输出:

[]
[1]
[2]
[1, 2]
[3]
[1, 3]
[2, 3]
[1, 2, 3]
[4]
[1, 4]
[2, 4]
[1, 2, 4]
[3, 4]
[1, 3, 4]
[2, 3, 4]
[1, 2, 3, 4]
[5]
[1, 5]
[2, 5]
[1, 2, 5]
[3, 5]
[1, 3, 5]
[2, 3, 5]
[1, 2, 3, 5]
[4, 5]
[1, 4, 5]
[2, 4, 5]
[1, 2, 4, 5]
[3, 4, 5]
[1, 3, 4, 5]
[2, 3, 4, 5]
[1, 2, 3, 4, 5]

请注意,它的第一个结果是空集。如果您想跳过,请将迭代从这个 for i in xrange(2**n): 更改为这个 for i in xrange(1, 2**n):一个空集。

这是适用于产生字符串输出的代码:

def powerset(s):
n = len(s)
masks = [1<<j for j in xrange(n)]
for i in xrange(2**n):
yield "".join([str(s[j]) for j in range(n) if (masks[j] & i)])

编辑 2009-10-24

好的,我看到您偏爱 Java 中的实现。我不懂Java,所以半路见你,给你C#代码:

    static public IEnumerable<IList<T>> powerset<T>(IList<T> s)
{
int n = s.Count;
int[] masks = new int[n];
for (int i = 0; i < n; i++)
masks[i] = (1 << i);
for (int i = 0; i < (1 << n); i++)
{
List<T> newList = new List<T>(n);
for (int j = 0; j < n; j++)
if ((masks[j] & i) != 0)
newList.Add(s[j]);
yield return newList;
}
}

关于java - 如何获取字符串的所有子序列组合(在 Java 或 C++ 等中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1617699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com