s1, s2, and s3 consist of lower-case English letters.
Solution:
class Solution {
Boolean[][][] dp;
public boolean isInterleave(String s1, String s2, String s3) {
int a = s1.length(), b = s2.length(), c = s3.length();
if (a + b != c) return false;
dp = new Boolean[a][b][c];
return helper(s1, 0, s2, 0, s3, 0);
}
private boolean helper(String s1, int i, String s2, int j, String s3, int k) {
// System.out.println(i + ", " + j + ", " + k);
if (i == s1.length()) {
return s2.substring(j).equals(s3.substring(k));
} else if (j == s2.length()) {
return s1.substring(i).equals(s3.substring(k));
}
if (dp[i][j][k] != null) return dp[i][j][k];
char a = s1.charAt(i);
char b = s2.charAt(j);
char c = s3.charAt(k);
if (a == c) {
if (helper(s1, i + 1, s2, j, s3, k + 1)) {
return dp[i][j][k] = true;
}
}
if (b == c) {
if (helper(s1, i, s2, j + 1, s3, k + 1)) {
return dp[i][j][k] = true;
}
}
return dp[i][j][k] = false;
}
}