Q:
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.
For example,
Given:
s1 = "aabcc"
,
s2 = "dbbca"
,
When s3 = "aadbbcbcac"
, return true.
When s3 = "aadbbbaccc"
, return false.
Solution:
public class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
if (s1.length() + s2.length() != s3.length())
return false;
int n1 = s1.length();
int n2 = s2.length();
boolean[][] dp = new boolean[n1+1][n2+1];
dp[0][0] = true;
for (int i = 1; i <= n1; i++)
dp[i][0] = s1.substring(0, i).equals(s3.substring(0, i));
for (int i = 1; i <= n2; i++)
dp[0][i] = s2.substring(0, i).equals(s3.substring(0, i));
for (int i = 1; i <= n1; i++) {
for (int j = 1; j <= n2; 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));
}
}
return dp[n1][n2];
}
}