让我们说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个字符的单词。
答案 0 :(得分: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());
}
答案 1 :(得分:1)
最简单 - 如果位数很小并且是固定的 - 将是简单的枚举。只需迭代字母表中的成员。
从名称字母表中我假设此字符串中的每个字符都是唯一的,但在解决方案中可能会出现多次。如果没有在接受排列之前必须执行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));
}
}
}
}