Problem: 3211. 生成不含相邻零的二进制字符串
文章目录

思路
使用深度优先搜索(DFS)方法进行递归构建符合条件的字符串。我们要求生成长度为
n
的二进制字符串,且其中没有相邻的0
。因此,针对每一个位置,我们可以根据当前字符结尾的情况递归地添加字符0
或1
。这个解法通过检查是否允许当前字符是0
,并根据条件进行递归处理,避免了相邻的0
出现。
解题过程
-
定义 DFS 函数:我们定义一个匿名递归函数
dfs
,它会接收当前构建的字符串current
。当current
的长度等于目标长度n
时,表示生成了一个符合条件的字符串,直接将其加入结果列表result
。 -
递归生成字符:
- 如果
current
是空字符串或者末尾字符不是'0'
,可以在末尾添加'0'
。 - 无论结尾字符是什么,都可以添加
'1'
。
- 如果
-
起始调用 DFS:从空字符串开始调用
dfs
,递归生成并加入所有可能的符合条件的字符串到result
中。
复杂度
- 时间复杂度: (O(2^n)) ;虽然理想情况下生成 (2^n) 种组合,但排除了包含相邻
0
的组合,因此实际复杂度小于 (2^n)。 - 空间复杂度: (O(2^n)) ;存储所有符合条件的字符串集合,同时考虑递归调用栈的深度。
Code
class Solution {
public:
vector<string> validStrings(int n) {
// 用于存储所有有效的二进制字符串
vector<string> result;
// 定义一个匿名函数 dfs,用于进行深度优先搜索
function<void(string)> dfs = [&](string current) {
// 如果当前字符串长度达到 n,说明生成了一个有效字符串
if (current.size() == n) {
result.push_back(current); // 将有效字符串添加到结果列表中
return; // 结束当前递归
}
// 如果当前字符串为空或末尾不是 '0',可以添加 '0'
if (current.empty() || current.back() != '0') {
dfs(current + '0'); // 递归调用,添加 '0'
}
// 总是可以添加 '1'
dfs(current + '1'); // 递归调用,添加 '1'
};
dfs(""); // 从空字符串开始进行递归
return result; // 返回所有生成的有效字符串
}
};