Welcome to Subscribe On Youtube

3211. Generate Binary Strings Without Adjacent Zeros

Description

You are given a positive integer n.

A binary string x is valid if all substrings of x of length 2 contain at least one "1".

Return all valid strings with length n, in any order.

 

Example 1:

Input: n = 3

Output: ["010","011","101","110","111"]

Explanation:

The valid strings of length 3 are: "010", "011", "101", "110", and "111".

Example 2:

Input: n = 1

Output: ["0","1"]

Explanation:

The valid strings of length 1 are: "0" and "1".

 

Constraints:

  • 1 <= n <= 18

Solutions

Solution 1: DFS

We can enumerate each position $i$ of a binary string of length $n$, and for each position $i$, we can enumerate the possible value $j$ it can take. If $j$ is $0$, then we need to check if its previous position is $1$. If it is $1$, we can continue to recurse further; otherwise, it is invalid. If $j$ is $1$, then we directly recurse further.

The time complexity is $O(n \times 2^n)$, where $n$ is the length of the string. Ignoring the space consumption of the answer array, the space complexity is $O(n)$.

  • class Solution {
        private List<String> ans = new ArrayList<>();
        private StringBuilder t = new StringBuilder();
        private int n;
    
        public List<String> validStrings(int n) {
            this.n = n;
            dfs(0);
            return ans;
        }
    
        private void dfs(int i) {
            if (i >= n) {
                ans.add(t.toString());
                return;
            }
            for (int j = 0; j < 2; ++j) {
                if ((j == 0 && (i == 0 || t.charAt(i - 1) == '1')) || j == 1) {
                    t.append(j);
                    dfs(i + 1);
                    t.deleteCharAt(t.length() - 1);
                }
            }
        }
    }
    
  • class Solution {
    public:
        vector<string> validStrings(int n) {
            vector<string> ans;
            string t;
            auto dfs = [&](auto&& dfs, int i) {
                if (i >= n) {
                    ans.emplace_back(t);
                    return;
                }
                for (int j = 0; j < 2; ++j) {
                    if ((j == 0 && (i == 0 || t[i - 1] == '1')) || j == 1) {
                        t.push_back('0' + j);
                        dfs(dfs, i + 1);
                        t.pop_back();
                    }
                }
            };
            dfs(dfs, 0);
            return ans;
        }
    };
    
  • class Solution:
        def validStrings(self, n: int) -> List[str]:
            def dfs(i: int):
                if i >= n:
                    ans.append("".join(t))
                    return
                for j in range(2):
                    if (j == 0 and (i == 0 or t[i - 1] == "1")) or j == 1:
                        t.append(str(j))
                        dfs(i + 1)
                        t.pop()
    
            ans = []
            t = []
            dfs(0)
            return ans
    
    
  • func validStrings(n int) (ans []string) {
    	t := []byte{}
    	var dfs func(int)
    	dfs = func(i int) {
    		if i >= n {
    			ans = append(ans, string(t))
    			return
    		}
    		for j := 0; j < 2; j++ {
    			if (j == 0 && (i == 0 || t[i-1] == '1')) || j == 1 {
    				t = append(t, byte('0'+j))
    				dfs(i + 1)
    				t = t[:len(t)-1]
    			}
    		}
    	}
    	dfs(0)
    	return
    }
    
  • function validStrings(n: number): string[] {
        const ans: string[] = [];
        const t: string[] = [];
        const dfs = (i: number) => {
            if (i >= n) {
                ans.push(t.join(''));
                return;
            }
            for (let j = 0; j < 2; ++j) {
                if ((j == 0 && (i == 0 || t[i - 1] == '1')) || j == 1) {
                    t.push(j.toString());
                    dfs(i + 1);
                    t.pop();
                }
            }
        };
        dfs(0);
        return ans;
    }
    
    

All Problems

All Solutions