生成不含相邻零的二进制字符串-LeetCode
3211. 生成不含相邻零的二进制字符串
🎯 问题描述(来源于LeetCode)
描述:
给定一个正整数 n,请你返回所有长度为 n 的二进制字符串,且字符串中不包含两个连续的 0。
可以按任意顺序返回答案。
说明:
- 字符串由字符
'0'和'1'组成。 - 不允许出现子串
"00"。
示例:
- 示例 1:
1 | 输入: n = 3 |
- 示例 2:
1 | 输入: n = 1 |
💻 解题思路
思路:回溯法(DFS) + 剪枝
算法步骤
- 初始化结果列表
ans和长度为n的路径列表path。 - 定义递归函数
dfs(i),表示当前正在确定第i个字符(0‑indexed):- 如果
i == n,将path拼接成字符串加入ans并返回。 - 首先尝试放置
'1'(因为'1'永远不会产生连续的0):path[i] = '1',递归dfs(i+1)。 - 然后尝试放置
'0':仅当可以放置'0'时才进行。放置'0'的条件是:i == 0(第一个字符可以放'0')或者前一个字符path[i-1] == '1'(确保不会出现"00")。若满足条件,则path[i] = '0',递归dfs(i+1)。
- 如果
- 从
dfs(0)开始搜索。 - 返回
ans。
代码实现
1 | from typing import List |
📊 性能分析
- 时间复杂度:,但实际有效字符串数量约为斐波那契数 ,因此远小于 。对于
n ≤ 20可高效运行。 - 空间复杂度:,递归栈深度和路径存储。
思考
该解法通过回溯逐位构建字符串,利用规则“不能有两个连续 0”进行剪枝:只有当上一个字符是 '1' 或者是开头时,才允许放置 '0'。
优点:
- 代码简洁,逻辑清晰,没有使用额外的集合或标记数组。
- 剪枝条件直接有效,避免了无效分支的递归。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






