题目描述:
给你一个正整数 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"。
解题思路
- 创建一个空的
std::vector<std::string>容器ans用于存储结果。 - 计算掩码
mask,其值为(1 << n) - 1,即由n个连续的1组成的二进制数。例如,当n=3时,mask为7(即二进制的111)。 - 使用循环遍历从
0到(1 << n) - 1的所有整数i。- 计算
x = mask ^ i,即将i与掩码进行异或操作,得到一个新的整数x。 - 检查
x是否满足条件:((x >> 1) & x) == 0。这个条件确保x中没有两个相邻的1。 - 如果条件满足,使用
std::bitset<32>将(1 << n) | i转换为二进制字符串,并截取最后n位作为结果字符串,添加到ans中。
- 计算
代码实现
class Solution {
public:
std::vector<std::string> validStrings(int n) {
std::vector<std::string> ans;
// 构建位数为n的掩码,示例1中n为3,则mask为111
int mask = (1 << n) - 1;
for (int i = 0; i < (1 << n); i++) {
// i与比特位都是1的mask异或,则标记0的位置位1.
int x = mask ^ i;
// x左移1位后与自身与为0,则x不存在练习的1.
if (((x >> 1) & x) == 0) {
// 使用bitset来处理二进制字符串,并转换为string类型
std::bitset<32> b((1 << n) | i);
ans.push_back(b.to_string().substr(32 - n));
}
}
return ans;
}
};
905

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



