我正在试图找出一种方法来获取字符串中字符串的所有组合,并保持固定长度。 例如,Charset:
{ 'a', 'b', 'c', 'd', 'e', 'f', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }
对于这个例子,我使用的是5的长度。
aaaaa
abaaa
aabaa
aaaba
aaaab
abbaa
aabba
...
zzzzz
我试过制定一个模式:
AAAAA
+
ABAAA
-+
AABAA
-+
AAABA
-+
AAAAB
++ -
ABBAA
- +
AABBA
- +
AAABB
+ -
ABABA
-+
ABAAB
-+
AABAB
-+
AAABB
++ -
ABBBA
- +
AABBB
+ -
ABABB
+-
ABBAB
+
ABBBB
但我被卡住了。
这不是家庭作业。
我该如何做到这一点?
编辑:
我是这样做的。下面接受的回应没有得到所有组合,但这样做:
for (int a = 0; a < 61; a++) {
for (int b = 0; b < 61; b++) {
for (int c = 0; c < 61; c++) {
for (int d = 0; d < 61; d++) {
for (int e = 0; e < 61; e++) {
System.out.println(charset[a] + "" + charset[b]
+ charset[c] + charset[d] + charset[e]);
}
}
}
}
}
答案 0 :(得分:1)
此库可能会帮助您cppitertools。有了这个库你就可以这样做:
std::vector<int> v = {1,2,3,4,5};
for (auto i : combinations(v,3)) {
//std::cout << i << std::endl;
for (auto j : i ) std::cout << j << " ";
std::cout<<std::endl;
}
在你的问题中你说的是组合,但是从你给出的输出看起来你想要与替换的组合,所以请记住,它们非常相似
您也可以只使用for循环(这是替换组合)。
for (int i = 0; i < size; ++i) {
for (int j = i; j < size; ++j) {
for (int k = j; k < size; ++k) {
//print i j k indices
}
}
}
答案 1 :(得分:1)
你需要找到长度 k 的所有组合,包括序列[ c 0 ... c < / EM> <子> 名词 -1 子>]。组合总数为 n k 。
一种方法是从0到 n k -1计数,表示基本 n 中的每个值向左填充零,并使用每个数字作为序列的索引:
/**
* Generate all combinations of length len using the supplied char array
*/
public String[] generateCombos(int k, char[] chars) {
final int n = chars.length;
final int nCombos = (int) Math.pow(n, k);
final String[] result = new String[nCombos];
final StringBuilder sb1 = new StringBuilder();
final StringBuilder sb2 = new StringBuilder();
for (int i = 0; i < nCombos; ++i) {
// generate zero-padded string representation of i base n
sb1.setLength(0);
final String indices = Integer.toString(i, n);
for (int j = k - indices.length(); j > 0; --j) {
sb1.append('0');
}
sb1.append(indices);
// process each digit
sb2.setLength(0);
for (int j = 0; j < k; ++j) {
sb2.append(chars[Integer.parseInt(sb1.substring(j, j + 1), n)]);
}
result[i] = sb2.toString();
}
return result;
}
这适用于任何结果字符串长度以及从Character.MIN_RADIX
到Character.MAX_RADIX
(2-36个字符)的任意数量的不同字符。