题目描述:要求是判断一个字符串能不能由两个字符串按照它们自己的顺序,每次挑取两个串中的一个字符来构造出来。
For example,
Given:
s1 ="aabcc",
s2 ="dbbca",
When s3 ="aadbbcbcac", return true.
When s3 ="aadbbbaccc", return false.
递归例程:
public class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
if(s1 == null||s2 == null||s3 == null||s1.length()+s2.length()!=s3.length())
return false;
return help(s1,s2,s3,s1.length(),s2.length(),s3.length());
}
public boolean help(String s1,String s2,String s3,int i,int j,int k)
{
if(k == 0)
return true;
boolean result=false;
if(i>=1&&s3.charAt(k-1) == s1.charAt(i-1))
result=help(s1,s2,s3,i-1,j,k-1);
if(j>=1&&result == false&&s3.charAt(k-1) == s2.charAt(j-1))
result=help(s1,s2,s3,i,j-1,k-1);
return result;
}
}
DP:
public boolean isInterleave(String s1, String s2, String s3) {
if(s1.length()+s2.length()!=s3.length())
return false;
//dp[i][j]表示s1长为i,s2长为j时与s3的匹配情况。
boolean[][] dp=new boolean[s1.length()+1][s2.length()+1]; //若新建矩阵dp[s1.length()][s2.length()],则当s1.length() == 0||s2.length() == 0时,对dp[0][0]赋值会越界。
dp[0][0]=true;
//s1中取0个s2中取i个 去和s3中0+i 个匹配</code>
for(int j=1;j<=s2.length();j++)
{
if(s2.charAt(j-1) == s3.charAt(j-1)&&dp[0][j-1] == true)
dp[0][j]=true;
}
//s2中取0个s1中取i个 去和s3中0+i 个匹配</code>
for(int i=1;i<=s1.length();i++)
{
if(s1.charAt(i-1) == s3.charAt(i-1)&&dp[i-1][0] == true)
dp[i][0]=true;
}
for(int i=1;i<=s1.length();i++)
{
for(int j=1;j<=s2.length();j++)
{
dp[i][j]=dp[i-1][j]&&(s3.charAt(i+j-1) == s1.charAt(i-1))
||dp[i][j-1]&&(s3.charAt(i+j-1) == s2.charAt(j-1));
}
}
return dp[s1.length()][s2.length()];
}