[LeetCode] 97. Interleaving String

Given s1s2s3, find whether s3 is formed by the interleaving of s1 and s2.

Example 1:

Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
Output: true

Example 2:

Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
Output: false

交错字符串。题意是给 s1, s2 和 s3,验证 s3 是否是由 s1 和 s2 交错组成的。这是典型的二维DP题,设DP[i][j]是s1的前i个字符 + s2的前j个字符组成的结果是否能跟s3的前i + j个字符匹配。首先排除corner case,如果s1 + s2的长度不等于s3,则说明是不行的。另外,还需要先在二维数组中计算出当s1为空和当s2为空的时候相对应的DP值。最后normal case是这两种其中一种为true则dp[i][j]为true。

  • s1的前i - 1个字符 + s2的前j个字符
  • s1的前i个字符 + s2的前j - 1个字符

其实也就是s1和s2拼接出来的部分的最后一个字符可来自于s1也可来自于s2,只要有一种情况为true则整体就为true。

时间O(mn)

空间O(mn)

Java实现

 1 class Solution {
 2     public boolean isInterleave(String s1, String s2, String s3) {
 3         // corner case
 4         if ((s1.length() + s2.length()) != s3.length()) {
 5             return false;
 6         }
 7 
 8         boolean[][] dp = new boolean[s1.length() + 1][s2.length() + 1];
 9         dp[0][0] = true;
10 
11         // when s2 is empty
12         for (int i = 1; i < dp.length; i++) {
13             dp[i][0] = dp[i - 1][0] && (s1.charAt(i - 1) == s3.charAt(i - 1));
14         }
15 
16         // when s1 is empty
17         for (int i = 1; i < dp[0].length; i++) {
18             dp[0][i] = dp[0][i - 1] && (s2.charAt(i - 1) == s3.charAt(i - 1));
19         }
20 
21         for (int i = 1; i < dp.length; i++) {
22             for (int j = 1; j < dp[0].length; j++) {
23                 dp[i][j] = (dp[i - 1][j] && s1.charAt(i - 1) == s3.charAt(i + j - 1))
24                         || (dp[i][j - 1] && s2.charAt(j - 1) == s3.charAt(i + j - 1));
25             }
26         }
27 
28         return dp[s1.length()][s2.length()];
29     }
30 }

LeetCode 题目总结

猜你喜欢

转载自www.cnblogs.com/cnoodle/p/12894728.html
今日推荐