Description:
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:
s = s1 + s2 + ... + sn
t = t1 + t2 + ... + tm
|n - m| <= 1
- The interleaving is
s1 + t1 + s2 + t2 + s3 + t3 + ...
ort1 + s1 + t2 + s2 + t3 + s3 + ...
Note: a + b
is the concatenation of strings a
and b
.
Examples:
Example 1:
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.
Example 2:
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.
Example 3:
Input: s1 = "", s2 = "", s3 = ""
Output: true
Solution in Python:
Approach:
- Check Lengths:
- First, check if the lengths of
s1
ands2
sum up to the length ofs3
. If not,s3
cannot be an interleaving ofs1
ands2
.
- First, check if the lengths of
- Define DP Table:
- Use a 2D boolean DP table
dp
wheredp[i][j]
represents whether the firsti
characters ofs1
and the firstj
characters ofs2
can interleave to form the firsti + j
characters ofs3
.
- Use a 2D boolean DP table
- Initialization:
dp[0][0]
isTrue
because two empty strings can form an empty string.- Initialize the first row and first column based on the prefixes of
s1
ands2
.
- Fill DP Table:
- Iterate over the DP table, and for each cell
dp[i][j]
, check:- If
s1[i-1]
matchess3[i+j-1]
anddp[i-1][j]
isTrue
, thendp[i][j]
isTrue
. - If
s2[j-1]
matchess3[i+j-1]
anddp[i][j-1]
isTrue
, thendp[i][j]
isTrue
.
- If
- Iterate over the DP table, and for each cell
- Result:
- The value at
dp[len(s1)][len(s2)]
will be the answer.
- The value at
Python
class Solution:
def isInterleave(self, s1: str, s2: str, s3: str) -> bool:
# Check if the total length matches
if len(s1) + len(s2) != len(s3):
return False
# Initialize the DP table
dp = [[False] * (len(s2) + 1) for _ in range(len(s1) + 1)]
# Set the base case
dp[0][0] = True
# Initialize the first row
for i in range(1, len(s1) + 1):
dp[i][0] = dp[i-1][0] and s1[i-1] == s3[i-1]
# Initialize the first column
for j in range(1, len(s2) + 1):
dp[0][j] = dp[0][j-1] and s2[j-1] == s3[j-1]
# Fill the DP table
for i in range(1, len(s1) + 1):
for j in range(1, len(s2) + 1):
dp[i][j] = (dp[i-1][j] and s1[i-1] == s3[i+j-1]) or (dp[i][j-1] and s2[j-1] == s3[i+j-1])
# The answer is at dp[len(s1)][len(s2)]
return dp[len(s1)][len(s2)]
Explanation:
- Length Check: If the sum of the lengths of
s1
ands2
does not equal the length ofs3
, returnFalse
. - DP Initialization: Create a 2D list
dp
with dimensions(len(s1)+1) x (len(s2)+1)
and initialize all values toFalse
. - Base Case: Set
dp[0][0]
toTrue
because two empty strings can interleave to form an empty string. - First Row and Column: Initialize the first row and column of the DP table based on whether the prefixes of
s1
ands2
can match the corresponding prefix ofs3
. - Fill DP Table: For each cell in the table, check if the current character of
s3
matches the current character ofs1
ors2
and update the DP table accordingly. - Result: Return the value at
dp[len(s1)][len(s2)]
, which indicates ifs3
can be formed by interleavings1
ands2
.
This approach ensures that the solution is computed efficiently using dynamic programming.
Solution in Javascript:
JavaScript
/**
* @param {string} s1
* @param {string} s2
* @param {string} s3
* @return {boolean}
*/
var isInterleave = function(s1, s2, s3) {
// Check if the total length matches
if (s1.length + s2.length != s3.length) {
return false;
}
// Initialize the DP table
const dp = Array(s1.length + 1).fill(null).map(() => Array(s2.length + 1).fill(false));
// Base case
dp[0][0] = true;
// Initialize the first row
for (let i = 1; i <= s1.length; i++) {
dp[i][0] = dp[i-1][0] && s1[i-1] === s3[i-1];
}
// Initialize the first column
for (let j = 1; j <= s2.length; j++) {
dp[0][j] = dp[0][j-1] && s2[j-1] === s3[j-1];
}
// Fill the DP table
for (let i = 1; i <= s1.length; i++) {
for (let j = 1; j <= s2.length; j++) {
dp[i][j] = (dp[i-1][j] && s1[i-1] === s3[i+j-1]) || (dp[i][j-1] && s2[j-1] === s3[i+j-1]);
}
}
// The result is in dp[s1.length][s2.length]
return dp[s1.length][s2.length];
};
Solution in Java:
Java
class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
// Check if the total length matches
if (s1.length() + s2.length() != s3.length()) {
return false;
}
// Initialize the DP table
boolean[][] dp = new boolean[s1.length() + 1][s2.length() + 1];
// Base case
dp[0][0] = true;
// Initialize the first row
for (int i = 1; i <= s1.length(); i++) {
dp[i][0] = dp[i - 1][0] && s1.charAt(i - 1) == s3.charAt(i - 1);
}
// Initialize the first column
for (int j = 1; j <= s2.length(); j++) {
dp[0][j] = dp[0][j - 1] && s2.charAt(j - 1) == s3.charAt(j - 1);
}
// Fill the DP table
for (int i = 1; i <= s1.length(); i++) {
for (int j = 1; j <= s2.length(); j++) {
dp[i][j] = (dp[i - 1][j] && s1.charAt(i - 1) == s3.charAt(i + j - 1)) ||
(dp[i][j - 1] && s2.charAt(j - 1) == s3.charAt(i + j - 1));
}
}
// The result is in dp[s1.length()][s2.length()]
return dp[s1.length()][s2.length()];
}
}
Solution in C#:
C#
public class Solution {
public bool IsInterleave(string s1, string s2, string s3) {
// Check if the total length matches
if (s1.Length + s2.Length != s3.Length) {
return false;
}
// Initialize the DP table
bool[,] dp = new bool[s1.Length + 1, s2.Length + 1];
// Base case
dp[0, 0] = true;
// Initialize the first row
for (int i = 1; i <= s1.Length; i++) {
dp[i, 0] = dp[i - 1, 0] && s1[i - 1] == s3[i - 1];
}
// Initialize the first column
for (int j = 1; j <= s2.Length; j++) {
dp[0, j] = dp[0, j - 1] && s2[j - 1] == s3[j - 1];
}
// Fill the DP table
for (int i = 1; i <= s1.Length; i++) {
for (int j = 1; j <= s2.Length; j++) {
dp[i, j] = (dp[i - 1, j] && s1[i - 1] == s3[i + j - 1]) ||
(dp[i, j - 1] && s2[j - 1] == s3[i + j - 1]);
}
}
// The result is in dp[s1.Length, s2.Length]
return dp[s1.Length, s2.Length];
}
}