Given strings s1, s2, and s3, find whether s3 is formed by an interleaving of s1 and s2.
An interleaving of two strings s and t is a configuration where s and t are divided into n and m substrings respectively, such that:
|n - m| <= 1Note: a + b is the concatenation of strings a and b.
Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
Output: true
Explanation: One way to obtain s3 is:
Split s1 into s1 = "aa" + "bc" + "c", and s2 into s2 = "dbbc" + "a".
Interleaving the two splits, we get "aa" + "dbbc" + "bc" + "a" + "c" = "aadbbcbcac".
Since s3 can be obtained by interleaving s1 and s2, we return true.
Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
Output: false
Explanation: Notice how it is impossible to interleave s2 with any other string to obtain s3.
Input: s1 = "", s2 = "", s3 = ""
Output: true
0 <= s1.length, s2.length <= 1000 <= s3.length <= 200s1, s2, and s3 consist of lowercase English letters.Follow up: Could you solve it using only O(s2.length) additional memory space?
The recursive approach attempts to build the interleaved string one character at a time. At each step, we decide whether to take the next character from s1 or s2, and check recursively if taking that character leads to a solution. If both choices are possible, we try both.
s1, s2, and s3.s1 and s2 are at the start of their respective strings and s3 is also at the beginning, then s1 and s2 are interleaving s3.s1 matches with s3, make a recursive call by incrementing the index of s1 and s3.s2 matches with s3, make a recursive call by incrementing the index of s2 and s3.s1 and s2 can interleave s3.s1 and s2 respectively. The recursive tree depth is m + n.The recursive solution recalculates solutions for overlapping subproblems, leading to inefficiencies. By storing previously calculated results in a 2D array, we can optimize the recursive solution using memoization.
memo where memo[i][j] indicates whether s1[i:] and s2[j:] can interleave into s3[i+j:].memo before making recursive calls, and check memo before calculating new results.(i, j) is computed only once.Transforming the recursive approach into an iterative form using a 2D boolean array can avoid the function call overhead.
dp where dp[i][j] is true if s1[0:i] and s2[0:j] can interleave into s3[0:i+j].dp[0][0] to true because empty strings interleave to make an empty string.s1 and s2 and fill dp based on previous results.dp[m][n].s1 and n is the length of s2.