Start learning free

LESSON 338 OF 410 · DYNAMIC PROGRAMMING

Binary Strings Without Consecutive Ones in Java (Time Complexity: O(N))

Practice O(n) Read the full explanation

Given a non-negative integer N return the number of binary strings of length N without 2 consecutive ones

Example:

Input: N = 3
Output: 5
Explanation: [
    "000",
    "001",
    "010",
    "100",
    "101",
]
Notes: N <= 30
STEP 1 OF 5
    Ctrl + Enter to check

    JAVA · DYNAMIC PROGRAMMING

    Binary Strings Without Consecutive Ones in Java, explained

    Understanding the Problem

    The core challenge of this problem is to generate binary strings of a given length N such that no two consecutive '1's appear in the string. This problem is significant in various applications such as coding theory, data transmission, and error detection where consecutive ones might be problematic.

    Potential pitfalls include misunderstanding the constraints and generating strings that do not meet the criteria.

    Approach

    To solve this problem, we can use dynamic programming. The idea is to build the solution for length N using the solutions for smaller lengths.

    Let's define two arrays:

    • dp0[i]: Number of binary strings of length i ending with '0'
    • dp1[i]: Number of binary strings of length i ending with '1'

    The recurrence relations are:

    • dp0[i] = dp0[i-1] + dp1[i-1] (We can append '0' to any string of length i-1)
    • dp1[i] = dp0[i-1] (We can only append '1' to strings of length i-1 ending with '0')

    The total number of valid strings of length N is dp0[N] + dp1[N].

    Algorithm

    1. Initialize dp0[1] and dp1[1] to 1 since there are two valid strings of length 1: "0" and "1".

    2. Iterate from 2 to N, updating dp0[i] and dp1[i] using the recurrence relations.

    3. Return the sum of dp0[N] and dp1[N].

    Code Implementation

    
    public class BinaryStringsWithoutConsecutiveOnes {
        public static int countBinaryStrings(int N) {
            if (N == 0) return 1;
            if (N == 1) return 2;
    
            // Arrays to store the number of valid strings ending with 0 and 1
            int[] dp0 = new int[N + 1];
            int[] dp1 = new int[N + 1];
    
            // Base cases
            dp0[1] = 1;
            dp1[1] = 1;
    
            // Fill the dp arrays
            for (int i = 2; i <= N; i++) {
                dp0[i] = dp0[i - 1] + dp1[i - 1];
                dp1[i] = dp0[i - 1];
            }
    
            // The total number of valid strings of length N
            return dp0[N] + dp1[N];
        }
    
        public static void main(String[] args) {
            int N = 3;
            System.out.println("Number of binary strings of length " + N + " without consecutive ones: " + countBinaryStrings(N));
        }
    }
    

    Complexity Analysis

    The time complexity of this approach is O(N) because we iterate from 2 to N, performing constant-time operations in each iteration. The space complexity is also O(N) due to the storage required for the dp0 and dp1 arrays.

    Edge Cases

    Potential edge cases include:

    • N = 0: The output should be 1 (the empty string).
    • N = 1: The output should be 2 (strings "0" and "1").

    Testing

    To test the solution comprehensively, consider the following test cases:

    • N = 0: Expected output is 1.
    • N = 1: Expected output is 2.
    • N = 2: Expected output is 3 (strings "00", "01", "10").
    • N = 3: Expected output is 5 (strings "000", "001", "010", "100", "101").

    Thinking and Problem-Solving Tips

    When approaching such problems:

    • Break down the problem into smaller subproblems.
    • Look for patterns and recurrence relations.
    • Use dynamic programming to store intermediate results and avoid redundant calculations.

    Conclusion

    Understanding and solving problems like this one helps improve your dynamic programming skills and your ability to recognize patterns in problems. Practice is key to mastering these concepts.

    Additional Resources

    For further reading and practice, consider the following resources:

    Keep going with JavaAbout 340 step-by-step lessons, from your first line of code to coding interviews. Free to start.
    Start learning free