题目描述
给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。
示例 1:
输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac" 输出: true
示例 2:
输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc" 输出: false
思路:dp[i][j]代表s1的前i个字符和s2的前j个字符能否交错构成s3的前i+j个字符
1、dp[0][0]=true(都为空时成立)
2、初始化s1中取0个s2中取i个 去和s3中0+i 个匹配
3、初始化s2中取0个s1中取i个 去和s3中0+i 个匹配
4、两层循环遍历得到最终解
public class Solution {
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;i++){
if(s1.charAt(i-1)==s3.charAt(i-1)){
dp[i][0]=dp[i-1][0];
}
else{
dp[i][0]=false;
}
}
for(int i=1;i<=len2;i++){
if(s2.charAt(i-1)==s3.charAt(i-1)){
dp[0][i]=dp[0][i-1];
}
else{
dp[0][i]=false;
}
}
for(int i=1;i<=len1;i++){
for(int j=1;j<=len2;j++){
dp[i][j]=(s1.charAt(i-1)==s3.charAt(i+j-1)&&dp[i-1][j])
||(s2.charAt(j-1)==s3.charAt(i+j-1)&&dp[i][j-1]);
}
}
return dp[len1][len2];
}
}