-
Notifications
You must be signed in to change notification settings - Fork 180
Expand file tree
/
Copy pathq097_InterleavingString.java
More file actions
75 lines (68 loc) · 2.47 KB
/
q097_InterleavingString.java
File metadata and controls
75 lines (68 loc) · 2.47 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
72
73
74
75
package leetcode_algorithm;
/**
* Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.
* <p>
* For example,
* Given:
* s1 = "aabcc",
* s2 = "dbbca",
* <p>
* When s3 = "aadbbcbcac", return true.
* When s3 = "aadbbbaccc", return false.
*/
public class q097_InterleavingString {
public static void main(String[] args) {
q097_InterleavingString solution = new q097_InterleavingString();
System.out.println(solution.isInterleave("aabcc", "dbbca", "aadbbcbcac"));
System.out.println(solution.isInterleave("aabcc", "dbbca", "aadbbbaccc"));
}
/**
* ½â·¨1 DFS
*
* @param s1
* @param s2
* @param s3
* @return
*/
public boolean isInterleave(String s1, String s2, String s3) {
char[] c1 = s1.toCharArray(), c2 = s2.toCharArray(), c3 = s3.toCharArray();
int m = s1.length(), n = s2.length();
if (m + n != s3.length()) return false;
return dfs(c1, c2, c3, 0, 0, 0, new boolean[m + 1][n + 1]);
}
public boolean dfs(char[] c1, char[] c2, char[] c3, int i, int j, int k, boolean[][] invalid) {
if (invalid[i][j]) return false;
if (k == c3.length) return true;
boolean valid =
i < c1.length && c1[i] == c3[k] && dfs(c1, c2, c3, i + 1, j, k + 1, invalid) ||
j < c2.length && c2[j] == c3[k] && dfs(c1, c2, c3, i, j + 1, k + 1, invalid);
if (!valid) invalid[i][j] = true;
return valid;
}
/**
* ½â·¨2
*
* @param s1
* @param s2
* @param s3
* @return
*/
public boolean isInterleave2(String s1, String s2, String s3) {
if (s1.length() + s2.length() != s3.length()) return false;
boolean[][] matrix = new boolean[s2.length() + 1][s1.length() + 1];
matrix[0][0] = true;
for (int i = 1; i < matrix[0].length; i++) {
matrix[0][i] = matrix[0][i - 1] && (s1.charAt(i - 1) == s3.charAt(i - 1));
}
for (int i = 1; i < matrix.length; i++) {
matrix[i][0] = matrix[i - 1][0] && (s2.charAt(i - 1) == s3.charAt(i - 1));
}
for (int i = 1; i < matrix.length; i++) {
for (int j = 1; j < matrix[0].length; j++) {
matrix[i][j] = (matrix[i - 1][j] && (s2.charAt(i - 1) == s3.charAt(i + j - 1)))
|| (matrix[i][j - 1] && (s1.charAt(j - 1) == s3.charAt(i + j - 1)));
}
}
return matrix[s2.length()][s1.length()];
}
}