lintcode-29交叉字符串

  • 描述

给出三个字符串: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,不是交叉组成
}

你可能感兴趣的:(算法题)