Check if strings are interleaved
by Krishna Ananthi
JavaScript
var isInterleave = function(s1, s2, s3) {
let m = s1.length, n = s2.length;
if (m + n !== s3.length) return false;
if (n < m) {
[s1, s2] = [s2, s1];
[m, n] = [n, m];
}
let dp = Array(n + 1).fill(false);
dp[n] = true;
for (let i = m; i >= 0; i--) {
let nextDp = Array(n + 1).fill(false);
nextDp[n] = true;
for (let j = n; j >= 0; j--) {
let fromS1 = (i < m && s1[i] === s3[i + j] && dp[j]) ? "✅" : "❌";
let fromS2 = (j < n && s2[j] === s3[i + j] && nextDp[j + 1]) ? "✅" : "❌";
if (i < m && s1[i] === s3[i + j] && dp[j]) {
nextDp[j] = true;
}
if (j < n && s2[j] === s3[i + j] && nextDp[j + 1]) {
nextDp[j] = true;
}
console.log(`i=${i}, j=${j}, s1[i]=${s1[i] ?? '∅'}, s2[j]=${s2[j] ?? '∅'}, s3[i+j]=${s3[i+j]}, fromS1=${fromS1}, fromS2=${fromS2}, nextDp[${j}]=${nextDp[j]}`);
}
dp = nextDp;
}
return dp[0];
};
console.log(isInterleave("aaaa", "bbbb", "aabbbbaa"))