Similar Problems

Similar Problems not available

Cracking The Safe - Leetcode Solution

Companies:

LeetCode:  Cracking The Safe Leetcode Solution

Difficulty: Hard

Topics: depth-first-search graph  

Problem statement: You have a bomb with an integer keypad and a diffuser to defuse it. The keypad has digits from 1 to 9 and it is now showing a string of n digits. Each key can be pressed any number of times. The diffuser is programmed to decode a sequence c of n digits. You have to determine the number of distinct sequences of c that can be obtained by pressing the keys on the keypad in some order. There are no other restrictions.

Solution: This problem can be solved using dynamic programming. The idea is to consider each digit in the sequence c one by one and determine the number of distinct sequences that can be obtained while considering the current digit. We can use a two-dimensional array dp[n][k] to store the number of distinct sequences of length n that can be obtained using the first k digits of the keypad. We can then use this array to compute the solution for the next digit.

The time complexity of this approach is O(n^3) and the space complexity is O(n^2). However, we can optimize the space complexity to O(n) by using a one-dimensional array instead of a two-dimensional array. The optimized approach is explained below.

Let dp[k] be the number of distinct sequences of length k that can be obtained using the first k digits of the keypad. We can then compute the value of dp[k+1] using the following formula:

dp[k+1] = sum(dp[i]) * (10 - i)

where i ranges from 0 to k. The idea is that we can append any digit to a sequence of length k and obtain a sequence of length k+1. The number of ways to append a digit i to a sequence of length k is dp[k][i]. The total number of ways to append any digit to a sequence of length k is sum(dp[k]). The number of distinct sequences of length k+1 that can be obtained using the first k+1 digits of the keypad is then given by sum(dp[k+1]).

The time complexity of this optimized approach is O(n^2) and the space complexity is O(n).

Here's the Python code for the optimized approach:

def crackSafe(n: int, k: int) -> str: if n == 1: return "".join(str(i) for i in range(k))

dp = [0] * (n+1)
dp[1] = k

ans = [0] * n
ans[0] = '0'

for i in range(2, n+1):
    dp[i] = dp[i-1] * (k-1) + k
    ans[i-1] = '0'

for i in range(n-2, -1, -1):
    for j in range(1, k):
        if dp[i+1] <= dp[i] * (k-1) + j:
            ans[i] = str(j)
            dp[i+1] -= j
            break
        dp[i+1] -= dp[i] * (k-1)

return "".join(ans)

Cracking The Safe Solution Code

1