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.
给定s1,s2,每次从s1或者s2取出一个字符,判断是否最终能够组成s3
思路:用动态规划,从后面开始,右边的子串能够成功,左边才有可能成功
每次取字符选择s1,s2都有可能,即:
if(dp[i+1][j]==true&&s1.charAt(i)==s3.charAt(i+j)
||dp[i][j+1]==true&&s2.charAt(j)==s3.charAt(i+j)){
dp[i][j]=true;
}
public static boolean isInterleave(String s1, String s2, String s3) {
if(s1.equals("")&&s2.equals("")&&s3.equals(""))return true;
if(s1.length()+s2.length()!=s3.length()){
return false;
}
int m = s1.length();
int n= s2.length();
int z = s3.length();
if(m==0)
return s2.equals(s3);
if(n==0)
return s1.equals(s3);
boolean dp[][] = new boolean[m+1][n+1];
dp[m][n]=true;
if(s1.charAt(m-1)==s3.charAt(m+n-1))
dp[m-1][n] = true;
for(int i=m-2;i>=0;i--){
if(dp[i+1][n]==false)
dp[i][n]=false;
else if(s1.charAt(i)==s3.charAt(i+n)){
dp[i][n]=true;
}
else
dp[i][n]=false;
}
if(s2.charAt(n-1)==s3.charAt(m+n-1))
dp[m][n-1] = true;
for(int i=n-2;i>=0;i--){
if(dp[m][i+1]==false)
dp[m][i]=false;
else if(s2.charAt(i)==s3.charAt(i+m)){
dp[m][i]=true;
}
else
dp[m][i]=false;
}
for(int i=m-1;i>=0;i--){
for(int j=n-1;j>=0;j--){
if(dp[i+1][j]==false&&dp[i][j+1]==false){
dp[i][j]=false;
}
else if(dp[i+1][j]==true&&s1.charAt(i)==s3.charAt(i+j)
||dp[i][j+1]==true&&s2.charAt(j)==s3.charAt(i+j)){
dp[i][j]=true;
}
else
dp[i][j]=false;
}
}
return dp[0][0];
}