本题核心思想是动态规划,涉及此类问题尽量不要用递归。
public boolean isInterleave(String s1, String s2, String s3) {
// Note: The Solution object is instantiated only once and is reused by each test case.if (s1 == null || s2 == null || s3 == null) return false;
if (s1.length() + s2.length() != s3.length()) return false;
boolean[][] dp = new boolean[s1.length() + 1][s2.length() + 1];
dp[0][0] = true;
for(int i = 1; i < s1.length() + 1; i++) {
if (s1.charAt(i - 1) == s3.charAt(i - 1) && dp[i - 1][0]) {
dp[i][0] = true;
}
}
for(int j = 1; j < s2.length() + 1; j++) {
if (s2.charAt(j - 1) == s3.charAt(j - 1) && dp[0][j - 1]) {
dp[0][j] = true;
}
}
for(int i = 1; i < s1.length() + 1; i++) {
for(int j = 1; j < s2.length() + 1; j++) {
if (s1.charAt(i - 1) == s3.charAt(i + j - 1) && dp[i - 1][j]) {
dp[i][j] = true;
}
if (s2.charAt(j - 1) == s3.charAt(i + j - 1) && dp[i][j - 1]) {
dp[i][j] = true;
}
}
}
return dp[s1.length()][s2.length()];
}