-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInterleavingString.java
More file actions
71 lines (68 loc) · 2.25 KB
/
Copy pathInterleavingString.java
File metadata and controls
71 lines (68 loc) · 2.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/**
* 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 is s1 + t1 + s2 + t2 + s3 + t3 + ... or t1 + s1 + t2 + s2 + t3 + s3 + ...
* Note: a + b is the concatenation of strings a and b.
*
*
*
* Example 1:
*
*
* Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
* Output: true
* Explanation: One way to obtain s3 is:
* Split s1 into s1 = "aa" + "bc" + "c", and s2 into s2 = "dbbc" + "a".
* Interleaving the two splits, we get "aa" + "dbbc" + "bc" + "a" + "c" = "aadbbcbcac".
* Since s3 can be obtained by interleaving s1 and s2, we return true.
* Example 2:
*
* Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
* Output: false
* Explanation: Notice how it is impossible to interleave s2 with any other string to obtain s3.
* Example 3:
*
* Input: s1 = "", s2 = "", s3 = ""
* Output: true
*
*
* Constraints:
*
* 0 <= s1.length, s2.length <= 100
* 0 <= s3.length <= 200
* s1, s2, and s3 consist of lowercase English letters.
*
*
* Follow up: Could you solve it using only O(s2.length) additional memory space?
*/
class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
int n = s1.length(), m = s2.length(), l = s3.length();
if(n + m != l) return false;
boolean[][] dp = new boolean[n + 1][m + 1];
for(int i = 0; i <= n; i++){
for(int j = 0; j <= m; j++){
if(i == 0 && j == 0) dp[i][j] = true;
else{
if(i == 0){
dp[i][j] = dp[i][j - 1] && s2.charAt(j - 1) == s3.charAt(j - 1);
}
else if(j == 0){
dp[i][j] = dp[i - 1][j] && s1.charAt(i - 1) == s3.charAt(i - 1);
}else{
dp[i][j] = (dp[i - 1][j] && s1.charAt(i - 1) == s3.charAt(i + j - 1)) ||
(dp[i][j - 1] && s2.charAt(j - 1) == s3.charAt(i + j - 1));
}
}
}
}
return dp[n][m];
}
}