题目描述
给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。
示例 1:
1  | 输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"  | 
示例 2:
1  | 输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"  | 
解题思路
关于字符串匹配的问题,建议一般不考虑使用递归来做,使用递归很容易造成超时。
对于字符串匹配及子序列问题,一般可考虑使用二维数组做动态规划。使用数组来标记动态规划过程中的状态,核心就是找到在这个动态规划过程中的递推公式。
对于本题,首先如果 s1 s2 s3 都为空的话,是返回 True 的,如果 s1 s2 的长度之和不等于 s3 的长度的话,是返回 False 的。
字符串匹配的过程,类似于是在一个二维矩阵中不断穿梭,讨论可达性的问题。

首先,初始化:
对于第0行,如果s1 为空的话,如果想返回True,则 S2 = S3,将S2与S3逐个匹配,如果 S2[index]==S3[index] 且前一个状态为 True,则将相应的矩阵值设为 True。
对于第0列,与上同理。先将整个矩阵的第0行与第0列进行初始化。
计算中间过程:
对于矩阵中其他位置的值,分析可得,一个位置如果想为True,则需要其左侧(j-1)或者上方(i-1)必有True值。
如果 matrix[i][j-1] 处的值为True的话,即左侧为True,需要判断S2中的当前位置与S3中的位置是否相等,即 S2[j-1]==S3[j-1+i],如果相等,则可设为True,如果不想等,可继续判断上方是否可达。
如果martix[i-1][j]处的值为True的话,即上方为True,需要判断 S1[i-1]==S3[i-1+j],如果相等,则该位置可设为True。
最后只需判断matrix[len(s1)][len(s2)]处是否为True即可。
代码实现
使用Python实现的代码,github地址
核心代码:
1  | class Solution:  |