LeetCode in Kotlin

3211. Generate Binary Strings Without Adjacent Zeros

Medium

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:

Solution

class Solution {
    fun validStrings(n: Int): List<String> {
        val strings: MutableList<String> = ArrayList()
        dfs(n, StringBuilder(), strings)
        return strings
    }

    private fun dfs(n: Int, build: StringBuilder, strings: MutableList<String>) {
        if (build.length == n) {
            strings.add(build.toString())
            return
        }
        // need to add a one
        if (build.isNotEmpty() && build[build.length - 1] == '0') {
            build.append('1')
            dfs(n, build, strings)
            // undo for backtracking
            build.setLength(build.length - 1)
            return
        }
        // choose to append a one
        build.append('1')
        dfs(n, build, strings)
        build.setLength(build.length - 1)
        // choose to append a zero
        build.append('0')
        dfs(n, build, strings)
        build.setLength(build.length - 1)
    }
}