Skip to main content

Command Palette

Search for a command to run...

Solving Leetcode Interviews in Seconds with AI: Scramble String

Updated
4 min read

Introduction

In this blog post, we will explore how to solve the LeetCode problem "87" using AI. LeetCode is a popular platform for preparing for coding interviews, and with the help of AI tools like Chatmagic, we can generate solutions quickly and efficiently - helping you pass the interviews and get the job offer without having to study for months.

Problem Statement

We can scramble a string s to get a string t using the following algorithm: If the length of the string is 1, stop. If the length of the string is > 1, do the following: Split the string into two non-empty substrings at a random index, i.e., if the string is s, divide it to x and y where s = x + y. Randomly decide to swap the two substrings or to keep them in the same order. i.e., after this step, s may become s = x + y or s = y + x. Apply step 1 recursively on each of the two substrings x and y. Given two strings s1 and s2 of the same length, return true if s2 is a scrambled string of s1, otherwise, return false. Example 1: Input: s1 = "great", s2 = "rgeat" Output: true Explanation: One possible scenario applied on s1 is: "great" --> "gr/eat" // divide at random index. "gr/eat" --> "gr/eat" // random decision is not to swap the two substrings and keep them in order. "gr/eat" --> "g/r / e/at" // apply the same algorithm recursively on both substrings. divide at random index each of them. "g/r / e/at" --> "r/g / e/at" // random decision was to swap the first substring and to keep the second substring in the same order. "r/g / e/at" --> "r/g / e/ a/t" // again apply the algorithm recursively, divide "at" to "a/t". "r/g / e/ a/t" --> "r/g / e/ a/t" // random decision is to keep both substrings in the same order. The algorithm stops now, and the result string is "rgeat" which is s2. As one possible scenario led s1 to be scrambled to s2, we return true. Example 2: Input: s1 = "abcde", s2 = "caebd" Output: false Example 3: Input: s1 = "a", s2 = "a" Output: true Constraints: s1.length == s2.length 1 <= s1.length <= 30 s1 and s2 consist of lowercase English letters.

Explanation

Here's an efficient solution to the scrambled string problem:

  • Dynamic Programming with Memoization: Utilize dynamic programming to avoid redundant computations. Store results of subproblems (whether a substring of s1 can be scrambled to a substring of s2) in a 3D memoization table.
  • Character Frequency Check: Before recursive calls, ensure the character frequencies of the two substrings being compared are equal. This optimization drastically reduces unnecessary recursion.
  • Recursive Exploration: Recursively explore the two possible scenarios: (1) the substrings are not swapped, and (2) the substrings are swapped.

  • Runtime Complexity: O(n4), where n is the length of the string. This is due to the nested loops for substring selection and the recursive calls.

  • Storage Complexity: O(n3) for the 3D memoization table.

Code

    def isScramble(s1: str, s2: str) -> bool:
    n = len(s1)
    if n != len(s2):
        return False

    memo = {}  # Memoization table to store results

    def solve(i: int, j: int, length: int) -> bool:
        if (i, j, length) in memo:
            return memo[(i, j, length)]

        if s1[i:i + length] == s2[j:j + length]:
            memo[(i, j, length)] = True
            return True

        # Character frequency check
        s1_chars = sorted(s1[i:i + length])
        s2_chars = sorted(s2[j:j + length])
        if s1_chars != s2_chars:
            memo[(i, j, length)] = False
            return False

        for k in range(1, length):
            # Case 1: No swap
            if solve(i, j, k) and solve(i + k, j + k, length - k):
                memo[(i, j, length)] = True
                return True

            # Case 2: Swap
            if solve(i, j + length - k, k) and solve(i + k, j, length - k):
                memo[(i, j, length)] = True
                return True

        memo[(i, j, length)] = False
        return False

    return solve(0, 0, n)

More from this blog

C

Chatmagic blog

2894 posts