获取给定字母表的所有4个字符的组合

让我们说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个字符的单词。

如果我正确理解了问题 – 所有组合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()); } 

最简单 – 如果位数很小并且是固定的 – 将是简单的枚举。 只是迭代字母表的成员。

从名称字母表中我假设此字符串中的每个字符都是唯一的,但在解决方案中可能会出现多次。 如果没有另外检查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)); } } } }