Interleaving String

Is s3 an interleaving of s1 and s2? 2D DP over consumed prefixes.

Medium
Time O(n * m) Space O(m)
LeetCode
5 min read
dp string

Problem#

Return true iff s3 is formed by interleaving the characters of s1 and s2 (preserving each input’s relative order).

Examples#

  • s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"true

Constraints#

  • 0 <= n, m <= 100, |s3| = n + m.

Approach#

dp[i][j] = can s3[:i+j] be formed from s1[:i] + s2[:j]. Transition: 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]). Roll to 1D.

Solution#

Interleaving String
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int n = s1.size(), m = s2.size();
if (n + m != (int)s3.size()) return false;
vector<bool> dp(m + 1, false);
dp[0] = true;
for (int j = 1; j <= m; ++j) dp[j] = dp[j - 1] && s2[j - 1] == s3[j - 1];
for (int i = 1; i <= n; ++i) {
dp[0] = dp[0] && s1[i - 1] == s3[i - 1];
for (int j = 1; j <= m; ++j) {
dp[j] = (dp[j] && s1[i - 1] == s3[i + j - 1])
|| (dp[j - 1] && s2[j - 1] == s3[i + j - 1]);
}
}
return dp[m];
}
};

Editorial#

Two transitions per cell: char from s1 or char from s2. Rolling 1D works because dp[i][j] only needs dp[i-1][j] (rolled into current dp[j]) and dp[i][j-1] (just updated).

Complexity#

  • Time: O(n * m).
  • Space: O(m).

Concept revision#

Search ESC

Keyboard shortcuts

Shortcuts are disabled while typing in inputs.