交错字符串。给定三个字符串 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)\)。