问题描述:
给你一个正整数 n。
如果一个二进制字符串 x 的所有长度为 2 的
子字符串
中包含 至少 一个 "1",则称 x 是一个 有效 字符串。
返回所有长度为 n 的 有效 字符串,可以以任意顺序排列。
解题思路:
观察到:以 “1” 结尾的字符串没有任何限制,它可以接 “0” 或 “1”。例如,如果当前字符串是 “11”,我们可以生成 “110” 或 “111”;以 “0” 结尾的字符串不能再接 “0”,因为不能出现 “00” 的情况。因此,唯一的选择是后面接 “1”。例如,如果当前字符串是 “10”,则只能生成 “101”。解决这个问题的方法之一是暴力枚举所有可能的二进制数字,然后判断并记录答案。具体来说,可以遍历所有长度为 n 的二进制字符串,检查每个字符串是否满足条件。如果一个字符串满足条件,则将其添加到结果列表中。时间复杂度为 O(n * 2^n),因为总共有 2^n 个数字,每个数字需要 O(n) 的时间来判断和存储答案。空间复杂度为 O(2^n),因为需要额外的空间来存储答案。
参考代码:
class Solution {
public:
vector<string> validStrings(int n) {
vector<string> ans;
for (int s = 0; s < (1 << n); s++) {
string t;
bool ok = true;
int p = 1;
for (int i = 0; i < n; i++) {
int x = (s >> i) & 1;
if (x == 0 && p == 0) {
ok = false;
break;
}
p = x;
t += x + '0';
}
if (ok)
ans.emplace_back(t);
}
return ans;
}
};
3345

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



