题目原型:
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.
基本思路:
设状态 f[i][j],表示 s1[0,i] 和 s2[0,j],匹配 s3[0, i+j]。如果 s1 的最后一个字符等于 s3 的最后一个字符,则 f[i][j]=f[i-1][j];如果 s2 的最后一个字符等于 s3 的最后一个字符,则 f[i][j]=f[i][j-1]。因此状态转移方程如下:
f[i][j] = (s1[i - 1] == s3 [i + j - 1] && f[i - 1][j])|| (s2[j - 1] == s3 [i + j - 1] && f[i][j - 1]);
思路一:
递归,超时,代码略
思路二:
动态规划,时间和空间复杂度均为O(n2).
public boolean isInterleave(String s1, String s2, String s3)
{
if(s1.length()+s2.length()!=s3.length())
return false;
if(s1.equals("")||s1==null)
{
if(s3.equals(s2))
return true;
else
return false;
}
if(s2.equals("")||s2==null)
{
if(s3.equals(s1))
return true;
else
return false;
}
boolean[][] flag = new boolean[s1.length()+1][s2.length()+1];
//初始化
for(int i = 0;i<=s1.length();i++)
{
if(i==0)
flag[i][0] = true;
else
flag[i][0] = s1.charAt(i-1)==s3.charAt(i-1)&&flag[i-1][0];
}
for(int i = 1;i<=s2.length();i++)
{
flag[0][i] = s2.charAt(i-1)==s3.charAt(i-1)&&flag[0][i-1];
}
for(int i = 1;i<=s1.length();i++)
{
for(int j = 1;j<=s2.length();j++)
{
flag[i][j] = (s1.charAt(i-1)==s3.charAt(i+j-1)&&flag[i-1][j])||(s2.charAt(j-1)==s3.charAt(i+j-1)&&flag[i][j-1]);
}
}
return flag[s1.length()][s2.length()];
}
思路三:
采用滚动数组存储结果,空间复杂度优化为O(n)
public boolean isInterleave(String s1, String s2, String s3)
{
if(s1.length()+s2.length()!=s3.length())
return false;
if(s1.equals("")||s1==null)
{
if(s3.equals(s2))
return true;
else
return false;
}
if(s2.equals("")||s2==null)
{
if(s3.equals(s1))
return true;
else
return false;
}
if(s1.length()<s2.length())
return isInterleave(s2, s1, s3);
boolean[] flag = new boolean[s2.length()+1];
//初始化
for(int i = 0;i<=s2.length();i++)
{
if(i==0)
flag[i] = true;
else
flag[i] = s2.charAt(i-1)==s3.charAt(i-1)&&flag[i-1];
}
for(int i = 1;i<=s1.length();i++)
{
flag[0] = s1.charAt(i-1)==s3.charAt(i-1)&&flag[0];
for(int j = 1;j<=s2.length();j++)
{
flag[j] = (s1.charAt(i-1)==s3.charAt(i+j-1)&&flag[j])||(s2.charAt(j-1)==s3.charAt(i+j-1)&&flag[j-1]);
}
}
return flag[s2.length()];
}