【问题标题】:Get all 4-character combinations of a given alphabet获取给定字母表的所有 4 个字符组合
【发布时间】:2012-03-12 16:38:21
【问题描述】:

假设alphabet = "abcd1234" 我想要所有有 4 位数字的组合。 我不想遍历所有排列并只选择那些长度为 4 个字符的排列,因为字母可能很大。

编辑:这是我到目前为止所拥有的

String alpha = "abcdefg"; 

        for (int i = 0 ; i < alpha.length() ; i++) {
            for (int j = i ; j < alpha.length()-i ; j++) 
                    System.out.println(String.valueOf(alpha.charAt(i)) + String.valueOf(alpha.charAt(j))   );   
        }

不幸的是,我只得到一个 2 个字符的单词。而且我不能让它使用相同的循环结构打印 4 个字符的单词。

【问题讨论】:

  • 不展示你的劳动成果,意味着你懒得自己做,或者不够聪明。请通过展示你所做的来证明这些假设是错误的。
  • "N 选择 K" 问题在几个网站上被充分讨论,这是你想要的吗?就像 Andrzej 所问的那样……您现在面临什么问题?
  • 请在 EDIT 中找到我的成就

标签: java permutation combinations


【解决方案1】:

如果我正确理解了问题 - 所有组合 aaaa 到 4444 - 那么这将起作用。它是“可扩展的”——不需要每个字符嵌套循环。

String alpha = "abcd1234";
char[] seq = alpha.toCharArray();

int length = 4;
StringBuilder builder = new StringBuilder("    ");

int[] pos = new int[length];
int total = (int) Math.pow(alpha.length(), length);
for (int i = 0; i < total; i++) {
    for (int x = 0; x < length; x++) {
        if (pos[x] == seq.length) {
            pos[x] = 0;
            if (x + 1 < length) {
                pos[x + 1]++;
            }
        }
        builder.setCharAt(x, seq[pos[x]]);
    }
    pos[0]++;

    System.out.println(builder.toString());
}

【讨论】:

    【解决方案2】:

    最简单的 - 如果位数很小且固定 - 将是简单的枚举。只需遍历字母表的成员即可。

    从名称字母表中,我假设该字符串中的每个字符都是唯一的,但可以在解决方案中出现多次。如果不是额外检查,则必须在接受排列之前执行 i1 != i2 等。

    int alphaLen = alphabet.length();
    for (int i1 = 0; i1 < alphaLen; ++i1) {
        for (int i2 = 0; i2 < alphaLen; ++i2) {
            for (int i3 = 0; i3 < alphaLen; ++i3) {
                for (int i4 = 0; i4 < alphaLen; ++i4) {
                    foo(alphabet.charAt(i1) + alphabet.charAt(i2) + alphabet.charAt(i3) + alphabet.charAt(i4));
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-01-25
      • 1970-01-01
      • 2022-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 2015-03-18
      • 1970-01-01
      相关资源
      最近更新 更多