题目:
给你一个正整数 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"
。
提示:
1 <= n <= 18
思路:
回溯算法:总共的长度为 n 的字符串有 2^n 个,所以我们通过回溯寻找所有满足条件的字符串即可。每个位置以下面的规则进行填充:
如果前一个字符为 '0',那么这个字符只能填 '1'
如果前一个字符为 '1',那么这个字符就可以填两种情况
由于要判断前一个字符,那么对于第一个字符,就要特殊处理
代码:
class Solution {
public:
string str;
vector<string> ans;
void backTrack(int n) {
if (str.size() == n) {
ans.push_back(str);
return;
}
if (str[str.size() - 1] == '0') {
str.push_back('1');
backTrack(n);
str.erase(str.end() - 1);
return;
}
str.push_back('0');backTrack(n);str.erase(str.end() - 1);
str.push_back('1');backTrack(n);str.erase(str.end() - 1);
}
vector<string> validStrings(int n) {
if (n == 1) return {"0", "1"};
str.push_back('0');
backTrack(n);
str = "1";
backTrack(n);
return ans;
}
};