【问题标题】:every combination of a string without repeats java [closed]没有重复的字符串的每个组合java [关闭]
【发布时间】:2015-09-21 18:32:42
【问题描述】:

我是一名高中生,对编程比较陌生,并且正在研究一个数学问题并使用 java 来帮助我。无论如何,我遇到了内存问题。我想找到没有重复的字符串的所有可能组合。

例如,给定字符串“AABB”,我希望返回“AABB”、“ABAB”、“ABBA”、“BBAA”、“BABA”和“BAAB”。

这里也有类似的问题:Every combination of character array

此链接提供的解决方案通常是我想要的,但是在我的情况下它无法处理更长的字符串。在我的具体情况下,我想要一个能够获取包含 18 个字符的字符串的方法。

另外,我想找到所有组合的字符串,只需要包含2个字符;因此,可能有一种更有效的方法可以在二进制中执行此操作,但我不确定。

任何帮助将不胜感激。

【问题讨论】:

  • "另外,我想查找所有组合的字符串,只需要包含 2 个字符;因此,可能有一种更有效的方法可以在二进制中执行此操作,但我不是当然。”你是说你的字母表只有两个符号?
  • 18 岁!为 6.4 x 10**15。所以这需要一段时间。
  • 是的,它是一种关系的表示,其中某物要么存在,要么不存在。
  • 实际上是 18!/(10!*8!) 这是 43,758,因为只有 2 个“字母”并且没有重复
  • 哦,如果你只有两个字符,让它们成为 '1' & '0' 那么你将拥有 (2**19)-1 或 524287。

标签: java string combinations


【解决方案1】:
 static void perm(char c0, int n0, char c1, int n1, String s, List<String> result) {
     if (n0 < 0 || n1 < 0)
         return;
     else if (n0 == 0 && n1 == 0)
         result.add(s);
     else {
         perm(c0, n0 - 1, c1, n1, s + c0, result);
         perm(c0, n0, c1, n1 - 1, s + c1, result);
     }

 }

 static List<String> perm(char c0, int n0, char c1, int n1) {
     List<String> result = new ArrayList<>();
     perm(c0, n0, c1, n1, "", result);
     return result;
 }

 public static void main(String[] args) {
     System.out.println(perm('A', 2, 'B', 2));
     // -> [AABB, ABAB, ABBA, BAAB, BABA, BBAA]
     System.out.println(perm('A', 8, 'B', 10).size());
     // -> 43758
 }

【讨论】:

  • 使用 LinkedList 可能比 ArrayList 更好,以防止不必要的调整大小。附加到 LinkedList 总是 O(1)。
  • 非常感谢。这对我很有帮助。我认为它的代码必须比这更复杂(但幸运的是它没有。)当它在合理的时间内一直运行时我很高兴,我能够看到一个列表所有不同的组合!
【解决方案2】:

由 2 个字符组成的长度为 18 的不同字符串的数量为 2^18 或 262,144。

伪代码:

  1. 创建由 2 个不同字符组成的所有可能的长度为 18 的字符串的集合 (262,144)
  2. 确定输入字符串中A类型字符的个数
  3. 确定集合中的哪些字符串与输入字符串具有相同数量的 A 类型字符
  4. 打印出这些字符串

【讨论】:

    猜你喜欢
    • 2017-06-29
    • 1970-01-01
    • 2013-05-18
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    相关资源
    最近更新 更多