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交织形成s3,第一反应,递归求解,然后超时,递归写起来比较简单,就不多说了。然后想到或许可以用动态规划,但是这里有两个变量,怎么处理,设个二维动态规划数组就可以啦。
源代码如下
/**
* 使用关于两个字符串的双向递归
* */
public boolean isInterleave(String s1, String s2, String s3) {
int len1 = s1.length();
int len2 = s2.length();
int len3 = s3.length();
if (len1 + len2 != len3)
return false;
boolean[][] dp=new boolean[len1+1][len2+1];
dp[0][0]=true;
for(int i=1;i<len1+1;i++)
{
char c1=s1.charAt(i-1);
char c3=s3.charAt(i-1);
dp[i][0]=(c1==c3)&&(dp[i-1][0]);
}
for(int j=1;j<len2+1;j++)
{
char c2=s2.charAt(j-1);
char c3=s3.charAt(j-1);
dp[0][j]=(c2==c3)&&dp[0][j-1];
}
for(int i=1;i<len1+1;i++)
{
for(int j=1;j<len2+1;j++)
{
char c1=s1.charAt(i-1);
char c2=s2.charAt(j-1);
char c3=s3.charAt(i+j-1);
if(c1==c3&&dp[i-1][j])
{
dp[i][j]=true;
}
if(c2==c3&&dp[i][j-1])
{
dp[i][j]=true;
}
}
}
return dp[len1][len2];
}