生成不含相邻零的二进制字符串

2024-10-29

题目:

给你一个正整数 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;
    }
};