Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.
For example,
Given:
s1 = "aabcc"
,
s2 = "dbbca"
,
When s3 = "aadbbcbcac"
, return true.
When s3 = "aadbbbaccc"
, return false.
Analysis:
Initially, we consider the state d[k,i,j] as whether the first k chars in s3 is the interleaving string of the first i chars of s1 and the first j chars of s2. We then have the formula:
d[k,i,j] = d[k-1][i-1][j] && s3[k]==s1[i] || d[k-1][i][j-1] && s3[k]==s2[j].
We then find that since a state d[k,i,j] has meaning only when k==(i+j), we actaully can reduce the number of states. We further use the state d[i,j] to present whether the s1[0-(i-1)] and s2[0-(j-1)] can interleave to s3[0-(i+j-1)]. we have formula:
d[i][j] = d[i-1][j] && s3[i+j-1]==s1[i-1] || d[i][j-1] && s3[i+j-1]==s2[j-1].
Solution:
1 public class Solution { 2 public boolean isInterleave(String s1, String s2, String s3) { 3 int len1 = s1.length(); 4 int len2 = s2.length(); 5 6 //NOTE: need to consider this boundary case! 7 if (s3.length()!=len1+len2) return false; 8 9 boolean[][] d = new boolean[len1+1][len2+1]; 10 d[0][0]=true; 11 for (int i=1;i<=len2;i++) 12 if (d[0][i-1] && s2.charAt(i-1)==s3.charAt(i-1)) 13 d[0][i]=true; 14 else d[0][i]=false; 15 16 for (int i=1;i<=len1;i++) 17 if (d[i-1][0] && s1.charAt(i-1)==s3.charAt(i-1)) 18 d[i][0]=true; 19 else d[i][0]=false; 20 21 for (int i=1;i<=len1;i++) 22 for (int j=1;j<=len2;j++) 23 if (d[i-1][j] && s1.charAt(i-1)==s3.charAt(i+j-1)) 24 d[i][j]=true; 25 else if (d[i][j-1] && s2.charAt(j-1)==s3.charAt(i+j-1)) 26 d[i][j]=true; 27 else d[i][j]=false; 28 29 30 return d[len1][len2]; 31 } 32 }