97. Interleaving String
Dynamic programming, dfs
class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
if (s3.length()!=s1.length()+s2.length()) return false;
// key: as long as s3 is consisent of characters in s1 and s2 (1 to 1 match),
// there is |n-m|<=1
char[] c1 = s1.toCharArray();
char[] c2 = s2.toCharArray();
char[] c3 = s3.toCharArray();
// memo[i][j] represent substring (length==i) of s1, and substring (length==j)
boolean[][] memo = new boolean[s1.length()+1][s2.length()+1];
memo[0][0] = true;
return checkInterleave(c1, c2, c3, 0, 0, memo);
}
private boolean checkInterleave(char[] c1, char[] c2, char[] c3, int index1, int index2, boolean[][] memo){
if(index1==c1.length && index2==c2.length) return memo[index1][index2];
// assume that memo[index1][index2] has been checked
// the next is to check memo[index1+1][index2] and memo[index1][index2+1]
boolean bool1 = false;
boolean bool2 = false;
if(memo[index1][index2]){
if (index1<c1.length && !memo[index1+1][index2]){
memo[index1+1][index2] = c3[index1+index2]==c1[index1];
bool1 = checkInterleave(c1, c2, c3, index1+1, index2, memo);
}
if(index2<c2.length && !memo[index1][index2+1]){
memo[index1][index2+1] = c3[index1+index2]==c2[index2];
bool2 = checkInterleave(c1, c2, c3, index1, index2+1, memo);
}
}
return bool1 || bool2;
}
}
DFS // Timeout
class Solution {
boolean result = false;
public boolean isInterleave(String s1, String s2, String s3) {
if(s3.length() != s1.length()+s2.length()) return false;
char[] c1 = s1.toCharArray();
char[] c2 = s2.toCharArray();
char[] c3 = s3.toCharArray();
checkInterleaving(c1, c2, c3, 0, 0, 0);
checkInterleaving(c2, c1, c3, 0, 0, 0);
return result;
}
// make sure this is always true: index3 = index1+index2+1
private void checkInterleaving(char[] c1, char[] c2, char[] c3, int index1, int index2, int index3){
if(index3 == c3.length || result){
result = true;
return;
}
// always make c1 to be the array to match, index1 as the index;
while (index3<c3.length && index1<c1.length && c3[index3]==c1[index1]){
checkInterleaving(c2, c1, c3, index2, index1+1, index3+1);
index3++;
index1++;
}
}
}
Last updated
Was this helpful?