- 描述
给出三个字符串:s1、s2、s3,判断s3是否由s1和s2交叉构成。
- 样例
比如 s1 = “aabcc” s2 = “dbbca”
当 s3 = “aadbbcbcac”,返回 true.
当 s3 = “aadbbbaccc”, 返回 false.
思路
如果s3是由s1、s2交叉构成,那么一定满足以下条件
1、s3的长度等于s1的长度加s2的长度。
2、s3的开头字母一定是s1的开头字母或者s2的开头字母。
3、如果s3为空,则s1、s2一定为空。s3的开头字母一定是s1的开头字母或者s2的开头字母这个好判断,但是以后的字母怎么判断呢?这里可以利用递归的思想,每次只判断开头的字母,判断完毕之后移除第一个字母,继续递归判断,直到不满足条件或者s3为空。根据以上想法写出代码(javascript)
代码(javascipt)
const isInterleave = function (s1, s2, s3) {
if((s1.length+s2.length)!=s3.length){
return false; //不满足条件1,不是交叉组成
}
if(s3.length===0){
return true; //s1、s2、s3都为空,满足条件
}
if(s1.length>0&&s1[0]===s3[0]){ //s1的开头字母为s3的开头字母,满足条件
//移除第一个字母,继续递归判断
if(isInterleave(s1.substr(1),s2,s3.substr(1))){
return true; //所有的字母都满足条件,是交叉组成
}
}
if(s2.length>0&&s2[0]===s3[0]){ //s2的开头字母为s3的开头字母,满足条件
//移除第一个字母,继续递归判断
if(isInterleave(s1,s2.substr(1),s3.substr(1))){
return true; //所有的字母都满足条件,是交叉组成
}
}
return false; //不满足推论2,不是交叉组成
}