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.
思路: 动态规划. 用一个二维数组存储,flag[i][j]表示s1的前i个字符和s2的前j个字符和s3的前(i+j)个字符的匹配情况.
<span style="font-size:14px;">public class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
int m=s1.length();
int n=s2.length();
int len=s3.length();
if((m+n)!=len)
return false;
boolean[][] flag=new boolean[m+1][n+1];
flag[0][0]=true;
for(int i=0;i<=m;i++){
for(int j=0;j<=n;j++){
if(i==0&&j==0)
continue;
if(j>0&&flag[i][j-1]==true){
flag[i][j]=(s2.charAt(j-1)==s3.charAt(i+j-1));
}
else if(i>0&&flag[i-1][j]==true)
flag[i][j]|=(s1.charAt(i-1)==s3.charAt(i+j-1));
else if(i==0)
flag[0][j]=flag[0][j-1]&&(s2.charAt(j-1)==s3.charAt(j-1));
else if(j==0)
flag[i][j]=flag[i-1][0]&&(s1.charAt(i-1)==s3.charAt(i-1));
else
flag[i][j]=false;
}
}
return flag[m][n];
}
}</span>