给你一个正整数 n。
如果一个二进制字符串 x 的所有长度为 2 的
子字符串
中包含 至少 一个 "1",则称 x 是一个 有效 字符串。
返回所有长度为 n 的 有效 字符串,可以以任意顺序排列。
示例 1:
输入: n = 3
输出: ["010","011","101","110","111"]
解释:
长度为 3 的有效字符串有:"010"、"011"、"101"、"110" 和 "111"。
示例 2:
输入: n = 1
输出: ["0","1"]
解释:
长度为 1 的有效字符串有:"0" 和 "1"。
from typing import List
class Solution:
def validStrings(self, n: int) -> List[str]:
results = []
def is_valid(s: str) -> bool:
# Check all length-2 substrings
for i in range(len(s) - 1):
if s[i] == '0' and s[i + 1] == '0':
return False
return True
def generate(current: str):
if len(current) == n:
if is_valid(current):
results.append(current)
return
# Add '0' and '1' recursively
generate(current + '0')
generate(current + '1')
generate('')
return results
# Example usage
sol = Solution()
print(sol.validStrings(3)) # Output: ['010', '011', '101', '110', '111']
print(sol.validStrings(1)) # Output: ['0', '1']
解题思路
我们可以使用以下步骤来解决这个问题:
- 递归生成所有二进制字符串:我们从空字符串开始递归地添加
0和1,直到字符串长度达到n。 - 验证有效性:在生成每个字符串后,检查其是否满足有效性条件。
- 返回结果:返回所有符合条件的有效字符串。
代码解析
-
is_valid 函数:检查生成的字符串是否满足有效性条件。它通过遍历字符串的每个字符,检查是否存在连续的
0。 -
generate 函数:使用递归构建字符串,直到字符串长度达到
n。在每次达到长度n时,它会调用is_valid来判断字符串是否有效。 -
结果存储:所有有效的字符串被存储在
results列表中,并在最后返回。
复杂度分析
-
时间复杂度:在最坏情况下,需要生成
2^n个二进制字符串,并对每个字符串进行有效性检查,因此时间复杂度为 O(n⋅2n)O(n \cdot 2^n)O(n⋅2n)。 -
空间复杂度:存储结果的空间为 O(2n)O(2^n)O(2n),同时还要考虑递归栈的深度,最坏情况为 O(n)O(n)O(n)。
通过以上代码,我们可以生成长度为 n 的所有有效二进制字符串
826

被折叠的 条评论
为什么被折叠?



