Leetcode-97-交错字符串

题目

给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。

示例 1:

输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”
输出: true
示例 2:

输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”
输出: false

动态规划

要判断s3是否由s1s2交错而成的, 首先看长度.

如果|s1|+|s2| != |s3|, 那么说明s3不是由s1s2交错而成的.

假设dp[i][j]表示s1的前i个元素和s2的前j个元素能否构成s3的前i+j个元素.

那么dp[i][j]取决于dp[i-1][j], dp[i][j-1]以及对应位置的元素是否相等.

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
int n = s1.length(), m = s2.length(), t = s3.length();
if (n + m != t) return false;
boolean[][] dp = new boolean[n + 1][m + 1];
dp[0][0] = true;
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= m; j++) {
int p = i + j - 1;
if (i > 0) {
dp[i][j] = dp[i][j] || (s1.charAt(i - 1) == s3.charAt(p) && dp[i - 1][j]);
}
if (j > 0) {
dp[i][j] = dp[i][j] || (s2.charAt(j - 1) == s3.charAt(p) && dp[i][j - 1]);
}
}
}
return dp[n][m];
}
}

image-20200718092411513