您的位置:首页 > 其它

leetCode 97. Interleaving String

2017-09-27 10:18 295 查看
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]
=true;
if(s1.charAt(m-1)==s3.charAt(m+n-1))
dp[m-1]
= true;
for(int i=m-2;i>=0;i--){
if(dp[i+1]
==false)
dp[i]
=false;
else if(s1.charAt(i)==s3.charAt(i+n)){
dp[i]
=true;
}
else
dp[i]
=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];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode