今天的题目是个人非常喜欢的一个,题目的名字叫做“Interleaving String”,这个题目是什么意思呢?
理解题意
Interleaving 从字面上讲是交错交叉的意思,给定两个字符串s1:"a"和s2:"b",那么对于s3:"ab"我们说s3是s1和s2“交错”形成的一个字符串,也就是说对于s3中的一个字符,这个字符要么来自于s1要么来自于s3且s1和s2中的字符只能使用一次。
因此对于s1 = "ab", s2 = "cd", s3 = "acbd",我们可以说s3可以由s1和s2交错形成,过程是这样的:
使用s1的字符a
使用s2的字符c
使用s1的字符b
使用s2的字符d
这样就形成了s3:“acdb"
而对于s1 = "ab", s2 = "cd", s3 = "adbc"我们说s3不可以由s1和s2交错形成,原因很简单,过程是这样的:
s3的第一个字符是a,因此必须使用s1的第一个字符a
s3的第二个字符是d,但是此时可以用的s1的字符是b以及s2的字符c,无论选择s1亦或是选择s2都不能形成字符d,因此s3不可以由s1和s2交错形成
理解了题意后你能想到该怎么解决这个问题吗?
解决方法一:最简单解法
通常我们说在面试时针对算法题如果一下想不到最优解可以首先想一个最简单的时间复杂度较高的解法,那么对于这个问题来说最简单的解法是什么呢?
首先我们要意识到,这个问题的本质其实是一个“组合”问题,因为字符串s3是由s1和s2合并形成的,因此我们可以把s1和s2通过“交错”这种方式能形成的所有字符串组合出来然后看看s3是不是在这些字符串组合中。
对于s1:“ab”,s2:“cd”来说,我们首先把s1的字符a放到s2中,a可以放到s2的开头、末尾以及c和d的中间,因此形成了{acd&#