题解_Java
class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
//t: target
int n = s1.length(), m = s2.length(), t = s3.length();
//长度之和都不等,肯定无法由s1和s2交替组成s3
if (n + m != t) {
return false;
}
boolean[][] f = new boolean[n + 1][m + 1];
//边界条件:认为s1的前0个字符和s2的前0个字符,可以交替组成s3的前0个字符
f[0][0] = true;
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= m; j++) {
int p = i + j - 1;
if (i > 0) {
//官方代码前面这个'f[i][j] ||'是没必要的
f[i][j] = f[i - 1][j] && s1.charAt(i - 1) == s3.charAt(p);
}
if (j > 0) {
//如果前一步i>0时已算出f[i][j]为true,则下面的||会短路,f[i][j]直接就是true了
f[i][j] = f[i][j] || (f[i][j - 1] && s2.charAt(j - 1) == s3.charAt(p));
}
}
}
//返回结果:s1的前n个字符和s2的前m个字符,可否交替组成s3的前n+m个字符
return f[n][m];
}
}