You are given three strings s1, s2, and s3. Return true if s3 is formed by interleaving s1 and s2 together or false otherwise.
Interleaving two strings s and t is done by dividing s and t into n and m substrings respectively, where the following conditions are met
|n - m| <= 1, i.e. the difference between the number of substrings ofsandtis at most1.s = s1 + s2 + ... + snt = t1 + t2 + ... + tm- Interleaving
sandtiss1 + t1 + s2 + t2 + ...ort1 + s1 + t2 + s2 + ...
You may assume that s1, s2 and s3 consist of lowercase English letters.
Example 1:
Input: s1 = "aaaa", s2 = "bbbb", s3 = "aabbbbaa"
Output: trueExplanation: We can split s1 into ["aa", "aa"], s2 can remain as "bbbb" and s3 is formed by interleaving ["aa", "aa"] and "bbbb".
Example 2:
Input: s1 = "", s2 = "", s3 = ""
Output: trueExample 3:
Input: s1 = "abc", s2 = "xyz", s3 = "abxzcy"
Output: falseExplanation: We can't split s3 into ["ab", "xz", "cy"] as the order of characters is not maintained.
Constraints:
0 <= s1.length, s2.length <= 1000 <= s3.length <= 200
Topics
Recommended Time & Space Complexity
You should aim for a solution as good or better than O(m * n) time and O(m * n) space, where m is the length of the string s1 and n is the length of the string s2.
Hint 1
If the sum of the characters in s1 and s2 does not equal s3, we return false. Think in terms of recursion and visualize it as a decision tree, where we explore different combinations of portions from both strings. Can you determine the possible decisions at each recursion step?
Hint 2
We recursively iterate through the strings using indices i, j, and k for s1, s2, and s3, respectively. At each step, we extend the current path in two directions based on whether the k-th character of s3 matches the current character of s1 or s2. If any path returns true, we immediately return true. If k goes out of bounds, it means we have successfully formed the interleaved string, so we return true.
Hint 3
This approach is exponential. Can you think of a way to optimize it? Since k depends on i and j, it can be treated as a constant, as we can derive k using i + j.
Hint 4
We can use memoization to cache the results of recursive calls and avoid redundant computations. Treating i and j as states, we can use a hash map or a 2D array to store the results.