97. Interleaving String(交错字符串)
题目大意
Given strings s1
, s2
, and s3
, find whether s3
is formed by an interleaving of s1
and s2
.
An interleaving of two strings s
and t
is a configuration where s
and t
are divided into n
and m
substrings respectively, such that:
s = s1 + s2 + ... + sn
t = t1 + t2 + ... + tm
|n - m| <= 1
The interleaving iss1 + t1 + s2 + t2 + s3 + t3 + ...
ort1 + s1 + t2 + s2 + t3 + s3 + ...
Note:a + b
is the concatenation of stringsa
andb
.
中文释义
给定字符串 s1
、s2
和 s3
,判断 s3
是否由 s1
和 s2
交错形成。
两个字符串 s
和 t
的交错是一种配置,其中 s
和 t
被分成 n
和 m
个子串,满足以下条件:
s = s1 + s2 + ... + sn
t = 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
- 解释:一种获得 s3 的方式是:
将 s1 分割为 “aa” + “bc” + “c”,将 s2 分割为 “dbbc” + “a”。
交错这些分割,我们得到 “aa” + “dbbc” + “bc” + “a” + “c” = “aadbbcbcac”。
由于 s3 可以通过交错 s1 和 s2 获得,我们返回 true。
- 输入:
-
示例 2:
- 输入:
s1 = "aabcc"
,s2 = "dbbca"
,s3 = "aadbbbaccc"
- 输出:
false
- 解释:注意无法通过任何方式将 s2 与任何其他字符串交错以获得 s3。
- 输入:
-
示例 3:
- 输入:
s1 = ""
,s2 = ""
,s3 = ""
- 输出:
true
- 输入:
限制条件
0 <= s1.length, s2.length <= 100
0 <= s3.length <= 200
s1
、s2
和s3
由小写英文字母组成。
进阶
你能只使用 O(s2.length) 额外空间解决这个问题吗?
解题思路
使用动态规划(DP)来解决问题。创建一个二维 dp
数组来判断 s1
和 s2
的前缀是否可以交错形成 s3
的前缀。
步骤说明
- 初始化一个二维
dp
数组,dp[i][j]
表示s1
的前i
个字符和s2
的前j
个字符是否能交错形成s3
的前i+j
个字符。 - 对于每个
i
和j
,检查s1[i - 1]
是否等于s3[i + j - 1]
以及s2[j - 1]
是否等于s3[i + j - 1]
,并据此更新dp
。 - 返回
dp[s1.length][s2.length]
作为结果。
代码
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int length1 = s1.length(), length2 = s2.length(), length3 = s3.length();
if (length1 + length2 != length3) return false;
vector<vector<bool>> dp(length1 + 1, vector<bool>(length2 + 1, false));
dp[0][0] = true;
for (int i = 1; i <= length1; i++) dp[i][0] = dp[i - 1][0] && s1[i - 1] == s3[i - 1];
for (int j = 1; j <= length2; j++) dp[0][j] = dp[0][j - 1] && s2[j - 1] == s3[j - 1];
for (int i = 1; i <= length1; i++) {
for (int j = 1; j <= length2; j++) {
dp[i][j] = (dp[i - 1][j] && s1[i - 1] == s3[i + j - 1])
|| (dp[i][j - 1] && s2[j - 1] == s3[i + j - 1]);
}
}
return dp[length1][length2];
}
};