java - 生成给定长度并带有约束的二进制字符串
问题描述
我正在尝试编写一个逻辑,我想在其中生成给定大小的二进制字符串列表,n
并且该字符串的最大k
位数应设置为1
.
例子:
If n = 3, k = 1 ==> the number of 1's can be 0 or 1.
Then the output should be 000, 001, 010, 100
以下是我在此链接的帮助下使用的逻辑作为参考:
这里n
与 相同arr.length
。
static void generateAllBinaryStrings(int n, int arr[], int i, List<String> res, int k) {
if (i == n) {
StringBuilder sb = new StringBuilder();
int count = 0;
for (int j = 0; j < arr.length; j++) {
int val = arr[j];
if (val == 1) {
count++;
}
sb.append(val);
}
if (count <= k) {
res.add(sb.toString());
}
return;
}
arr[i] = 0;
generateAllBinaryStrings(n, arr, i + 1, res, k);
arr[i] = 1;
generateAllBinaryStrings(n, arr, i + 1, res, k);
}
public static void main(String args[]) {
int n = 3;
int[] arr = new int[n];
int k = 1;
int i = 0;
List<String> res = new ArrayList<>();
generateAllBinaryStrings(n, arr, i, res, k);
System.out.println(res);// Prints [000, 001, 010, 100]
}
此代码工作正常,但此逻辑生成所有可能的二进制字符串,然后根据字符串中 1 的数量进行过滤。
有没有针对这个问题的时间复杂度更低的算法。
解决方案
我想出了这个:
static void generateAllBinaryStrings(StringBuilder sb, int n, Set<String> res, int k) {
int len = sb.length();
if (k == 0) {
repeat(sb, '0', n);
res.add(sb.toString());
sb.setLength(len);
} else {
for (int i = 0; i <= n; ++i) {
repeat(sb, '0', i);
if (i < n) {
sb.append('1');
generateAllBinaryStrings(sb, n-i-1, res, k-1);
} else {
res.add(sb.toString());
}
sb.setLength(len);
}
}
}
private static void repeat(StringBuilder sb, char c, int n) {
for (int j = 0; j < n; ++j) {
sb.append('0');
}
}
这个想法是你有k
一个可以放在一个长度的字符串中n
;所以如果k == 0
,唯一可能的值是n
零。如果k > 0
,您可以添加n
零或i
零,i
介于 0 和 n-1 之间的任意位置,然后是 a 1
,递归剩余空间和k-1
。
推荐阅读
- jquery - bootstrap 4动态导航不显示窗格
- python - w1 -= learning_rate * grad_w1 :为什么这在 python 3.7 jupyterLab 中不可用?
- django - amazon S3 存储桶区域应该更靠近主机服务器还是客户端服务器?
- asp.net-core - Asp.Net Core odata 无法识别控制器中的 Get 操作方法
- mongodb - Add total count to grouped + summed data
- c# - COMException (0x80041004): 没有足够的内存来操作 Crystal Reports
- mongodb - 无法使用 app.patch 并出现错误 发送到客户端后无法设置标头
- c# - 尝试排序时 DataGrid 数据消失
- r - 了解 ggpmisc 包 R 中 find_peaks 函数的忽略阈值参数
- r - 使用 R ggplot2 为图例键标签着色并删除键