方法还是挺简单的,就是可能会踩坑,首先很多种i和j都能组成相同长度的i+j,所以just because当前的s1[:i]和s2[:j]不能组成s3[:i+j],不能说明其他的ij组合不能,所以不能立马返回
class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
int m = s1.length();
int n = s2.length();
if (s3.length() != m + n) return false;
// dp[i][j] shows wether s1[0 - i] and s2[0 - j] can interleave to become s3[0 - i + j]
boolean[][] dp = new boolean[m + 1][n + 1];
dp[0][0] = true;
for (int i = 1; i <= m; i++) {
dp[i][0] = s1.charAt(i - 1) == s3.charAt(i - 1) ? dp[i - 1][0] : false;
}
for (int i = 1; i <= n; i++) {
dp[0][i] = s2.charAt(i - 1) == s3.charAt(i - 1) ? dp[0][i - 1] : false;
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
char ch1 = s1.charAt(i - 1);
char ch2 = s2.charAt(j - 1);
char ch3 = s3.charAt(i + j - 1);
// 不能写在一起,要相对应匹配 不能ch1 == ch3 && dp[i][j - 1]
// if (ch1 == ch3 || ch2 == ch3) {
// dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
// } else {
// 仅仅因为当前没有匹配的不能提前返回
// 因为长度为len的s3有很多种i,j组合方式,有一个可以就行
// dp[i][j] = false;
// }
dp[i][j] = (ch1 == ch3 && dp[i - 1][j]) || (ch2 == ch3 && dp[i][j - 1]);
}
}
return dp[m][n];
}
}