Given s1, s2, s3, find whether s3 is formed by the interleaving ofs1 ands2.
For example,
Given:
s1 = "aabcc"
,
s2 = "dbbca"
,
When s3 = "aadbbcbcac"
, return true.
When s3 = "aadbbbaccc"
, return false.
思路:双序列型DP,首先看尾巴,s1[i],s2[j] 能否表达s3[k], 但是我们发现k = i + j,所以省去一维空间,做dp的题的时候,开数组的时候,首先看看有没有数学公式联系,如果有,降维,有几个降几维;
f[i][j] 表示X前i + j 个字符是否由A的前i个字符和B前j个字符组成;
f[i][j] = (f[i-1][j] AND A[i-1] == X[i+j-1]) OR (f[i][j-1] AND X[i+j-1] == B[j-1]) ;
class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
int m = s1.length();
int n = s2.length();
if(m + n != s3.length()) {
return false;
}
boolean[][] dp = new boolean[m + 1][n + 1];
for(int i = 0; i <= m; i++) {
for(int j = 0; j <= n; j++) {
if(i == 0 && j == 0) {
dp[0][0] = true;
} else {
if(i - 1 >= 0 && s3.charAt(i + j - 1) == s1.charAt(i - 1)) {
dp[i][j] = dp[i - 1][j];
}
if(j - 1 >= 0 && s3.charAt(i + j - 1) == s2.charAt(j - 1)) {
dp[i][j] |= dp[i][j - 1];
}
}
}
}
return dp[m][n];
}
}