题目链接
题目描述
给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。
两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:
s = s1 + s2 + ... + snt = t1 + t2 + ... + tm|n - m| <= 1- 交错 是
s1 + t1 + s2 + t2 + s3 + t3 + ...或者t1 + s1 + t2 + s2 + t3 + s3 + ...
提示: a + b 意味着字符串 a 和 b 连接。
示例 1:

输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”
输出: true
示例 2:
输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”
输出: false
示例 3:
输入: s1 = “”, s2 =””, s3 = “”
输出: true
提示:
0 <= s1.length, s2.length <= 1000 <= s3.length <= 200-
解题思路
方法一:动态规划
我们定义 f(i, j) 表示 s_1的前 i 个元素和 s2的前 j 个元素是否能交错组成 s3的前 i + j 个元素。如果 s1的第 i 个元素和 s3的第 i + j 个元素相等,那么 s1的前 i 个元素和 s2的前 j 个元素是否能交错组成 s3的前 i + j 个元素取决于 s1的前 i - 1 个元素和 s2的前 jj 个元素是否能交错组成 s3的前 i + j - 1 个元素,即此时 f(i, j) 取决于 f(i - 1, j),在此情况下如果 f(i - 1, j) 为真,则 f(i, j) 也为真。同样的,如果 s2的第 j 个元素和 s3 的第 i + j 个元素相等并且 f(i, j - 1) 为真,则 f(i, j) 也为真。于是我们可以推导出这样的动态规划转移方程:

其中 p = i + j - 1。边界条件为 f(0,0)=True。class Solution {public boolean isInterleave(String s1, String s2, String s3) {if(s1.length() + s2.length() != s3.length()){return false;}boolean[][] dp = new boolean[s1.length() + 1][s2.length() + 1];dp[0][0] = true;for(int i = 0; i <= s1.length() ;++i){for(int j = 0; j <= s2.length(); ++j){int p = i + j - 1;if(i > 0){dp[i][j] |= dp[i-1][j]&&s1.charAt(i-1) == s3.charAt(p);}if(j > 0){dp[i][j] |= dp[i][j-1]&&s2.charAt(j-1) == s3.charAt(p);}}}return dp[s1.length()][s2.length()];}}
时间复杂度 O(nm)
- 空间复杂度 O(nm)
