交错字符串。给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。
示例 1:
1 |
|
示例 2:
1 |
|
思路一
穷举法,使用递归的思路,遍历s1
和 s2
组成的所有可能的交错字符串,判断是否与 s3
相同,交错字符串的组成方式如下所示:
1 |
|
代码如下:
1 |
|
时间复杂度 \(O(2^{m+n})\),\(m\) 和 \(n\) 分别是 s1
和 s2
的长度。
思路二
穷举法,但是进行剪枝处理。步骤如下:
- 从下标
0, 0, 0
开始,比较s1[i] == s3[k]
或者s2[j] == s3[k]
valid = True
当且仅当i
或j
与k
匹配并且剩下的串也是valid
- 只需要保存
invalid[i][j]
,因为大多数s1[0:i]
和s2[0:j]
都不能组成s3[0:k]
,保存valid[i][j]
效果也是一样
1 |
|
时间复杂度 \(O(2^{m+n})\),但是要小于思路一的时间复杂度。
思路三
动态规划。dp[i][j]
表示 s1[:i]
和 s2[:j]
组成的交错字符串是否与 s3[0:i+j]
相匹配。类似编辑距离。详见链接。
1 |
|
时间复杂度 \(O(mn)\)。
思路四
动态规划,可以使用一维数组保存思路三中的 dp
。
1 |
|
时间复杂度 \(O(mn)\)。