Skip to content

Commit 9295792

Browse files
authored
feat: add solutions to lcp problem: No.79 (#1219)
No.79.提取咒文
1 parent 9b11c01 commit 9295792

File tree

9 files changed

+353
-4
lines changed

9 files changed

+353
-4
lines changed

lcp/LCP 79. 提取咒文/README.md

+184-1
Original file line numberDiff line numberDiff line change
@@ -42,22 +42,205 @@
4242

4343
<!-- 这里可写通用的实现逻辑 -->
4444

45+
**方法一:BFS**
46+
47+
时间复杂度 $O(m \times n \times l)$,空间复杂度 $O(m \times n \times l)$。
48+
4549
<!-- tabs:start -->
4650

4751
### **Python3**
4852

4953
<!-- 这里可写当前语言的特殊实现逻辑 -->
5054

5155
```python
52-
56+
class Solution:
57+
def extractMantra(self, matrix: List[str], mantra: str) -> int:
58+
m, n = len(matrix), len(matrix[0])
59+
q = deque([(0, 0, 0)])
60+
vis = {q[0]}
61+
dirs = (-1, 0, 1, 0, -1)
62+
ans = 0
63+
while q:
64+
for _ in range(len(q)):
65+
i, j, k = q.popleft()
66+
if k == len(mantra):
67+
return ans
68+
if matrix[i][j] == mantra[k]:
69+
t = (i, j, k + 1)
70+
if t not in vis:
71+
vis.add(t)
72+
q.append(t)
73+
else:
74+
for a, b in pairwise(dirs):
75+
x, y = i + a, j + b
76+
if 0 <= x < m and 0 <= y < n:
77+
t = (x, y, k)
78+
if t not in vis:
79+
vis.add(t)
80+
q.append(t)
81+
ans += 1
82+
return -1
5383
```
5484

5585
### **Java**
5686

5787
<!-- 这里可写当前语言的特殊实现逻辑 -->
5888

5989
```java
90+
class Solution {
91+
public int extractMantra(String[] matrix, String mantra) {
92+
int m = matrix.length, n = matrix[0].length();
93+
int l = mantra.length();
94+
Deque<int[]> q = new ArrayDeque<>();
95+
q.offer(new int[] {0, 0, 0});
96+
boolean[][][] vis = new boolean[m][n][l + 1];
97+
vis[0][0][0] = true;
98+
int[] dirs = {-1, 0, 1, 0, -1};
99+
int ans = 0;
100+
for (; !q.isEmpty(); ++ans) {
101+
for (int size = q.size(); size > 0; --size) {
102+
var p = q.poll();
103+
int i = p[0], j = p[1], k = p[2];
104+
if (k == l) {
105+
return ans;
106+
}
107+
if (matrix[i].charAt(j) == mantra.charAt(k) && !vis[i][j][k + 1]) {
108+
vis[i][j][k + 1] = true;
109+
q.offer(new int[] {i, j, k + 1});
110+
} else {
111+
for (int c = 0; c < 4; ++c) {
112+
int x = i + dirs[c], y = j + dirs[c + 1];
113+
if (x >= 0 && x < m && y >= 0 && y < n && !vis[x][y][k]) {
114+
vis[x][y][k] = true;
115+
q.offer(new int[] {x, y, k});
116+
}
117+
}
118+
}
119+
}
120+
}
121+
return -1;
122+
}
123+
}
124+
```
125+
126+
### **C++**
127+
128+
```cpp
129+
class Solution {
130+
public:
131+
int extractMantra(vector<string>& matrix, string mantra) {
132+
int m = matrix.size(), n = matrix[0].size();
133+
int l = mantra.size();
134+
queue<tuple<int, int, int>> q;
135+
q.push({0, 0, 0});
136+
bool vis[m][n][l + 1];
137+
memset(vis, 0, sizeof(vis));
138+
int dirs[5] = {-1, 0, 1, 0, -1};
139+
int ans = 0;
140+
for (; q.size(); ++ans) {
141+
for (int size = q.size(); size; --size) {
142+
auto [i, j, k] = q.front();
143+
q.pop();
144+
if (k == l) {
145+
return ans;
146+
}
147+
if (matrix[i][j] == mantra[k] && !vis[i][j][k + 1]) {
148+
vis[i][j][k + 1] = true;
149+
q.push({i, j, k + 1});
150+
} else {
151+
for (int c = 0; c < 4; ++c) {
152+
int x = i + dirs[c], y = j + dirs[c + 1];
153+
if (x >= 0 && x < m && y >= 0 && y < n && !vis[x][y][k]) {
154+
vis[x][y][k] = true;
155+
q.push({x, y, k});
156+
}
157+
}
158+
}
159+
}
160+
}
161+
return -1;
162+
}
163+
};
164+
```
165+
166+
### **Go**
167+
168+
```go
169+
func extractMantra(matrix []string, mantra string) (ans int) {
170+
m, n, l := len(matrix), len(matrix[0]), len(mantra)
171+
q := [][3]int{[3]int{0, 0, 0}}
172+
vis := make([][][]bool, m)
173+
for i := range vis {
174+
vis[i] = make([][]bool, n)
175+
for j := range vis[i] {
176+
vis[i][j] = make([]bool, l+1)
177+
}
178+
}
179+
vis[0][0][0] = true
180+
dirs := [5]int{-1, 0, 1, 0, -1}
181+
for ; len(q) > 0; ans++ {
182+
for size := len(q); size > 0; size-- {
183+
p := q[0]
184+
q = q[1:]
185+
i, j, k := p[0], p[1], p[2]
186+
if k == l {
187+
return ans
188+
}
189+
if matrix[i][j] == mantra[k] && !vis[i][j][k+1] {
190+
vis[i][j][k+1] = true
191+
q = append(q, [3]int{i, j, k + 1})
192+
} else {
193+
for c := 0; c < 4; c++ {
194+
x, y := i+dirs[c], j+dirs[c+1]
195+
if x >= 0 && x < m && y >= 0 && y < n && !vis[x][y][k] {
196+
vis[x][y][k] = true
197+
q = append(q, [3]int{x, y, k})
198+
}
199+
}
200+
}
201+
}
202+
}
203+
return -1
204+
}
205+
```
60206

207+
### **TypeScript**
208+
209+
```ts
210+
function extractMantra(matrix: string[], mantra: string): number {
211+
const [m, n, l] = [matrix.length, matrix[0].length, mantra.length];
212+
const q: number[][] = [[0, 0, 0]];
213+
const vis: boolean[][][] = Array(m)
214+
.fill(0)
215+
.map(() =>
216+
Array(n)
217+
.fill(0)
218+
.map(() => Array(l + 1).fill(false)),
219+
);
220+
const dirs: number[] = [-1, 0, 1, 0, -1];
221+
let ans = 0;
222+
for (; q.length > 0; ++ans) {
223+
for (let size = q.length; size > 0; --size) {
224+
const [i, j, k] = q.shift()!;
225+
if (k === l) {
226+
return ans;
227+
}
228+
if (matrix[i][j] === mantra[k] && !vis[i][j][k + 1]) {
229+
vis[i][j][k + 1] = true;
230+
q.push([i, j, k + 1]);
231+
} else {
232+
for (let c = 0; c < 4; ++c) {
233+
const [x, y] = [i + dirs[c], j + dirs[c + 1]];
234+
if (x >= 0 && x < m && y >= 0 && y < n && !vis[x][y][k]) {
235+
vis[x][y][k] = true;
236+
q.push([x, y, k]);
237+
}
238+
}
239+
}
240+
}
241+
}
242+
return -1;
243+
}
61244
```
62245

63246
### **...**

lcp/LCP 79. 提取咒文/Solution.cpp

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
class Solution {
2+
public:
3+
int extractMantra(vector<string>& matrix, string mantra) {
4+
int m = matrix.size(), n = matrix[0].size();
5+
int l = mantra.size();
6+
queue<tuple<int, int, int>> q;
7+
q.push({0, 0, 0});
8+
bool vis[m][n][l + 1];
9+
memset(vis, 0, sizeof(vis));
10+
int dirs[5] = {-1, 0, 1, 0, -1};
11+
int ans = 0;
12+
for (; q.size(); ++ans) {
13+
for (int size = q.size(); size; --size) {
14+
auto [i, j, k] = q.front();
15+
q.pop();
16+
if (k == l) {
17+
return ans;
18+
}
19+
if (matrix[i][j] == mantra[k] && !vis[i][j][k + 1]) {
20+
vis[i][j][k + 1] = true;
21+
q.push({i, j, k + 1});
22+
} else {
23+
for (int c = 0; c < 4; ++c) {
24+
int x = i + dirs[c], y = j + dirs[c + 1];
25+
if (x >= 0 && x < m && y >= 0 && y < n && !vis[x][y][k]) {
26+
vis[x][y][k] = true;
27+
q.push({x, y, k});
28+
}
29+
}
30+
}
31+
}
32+
}
33+
return -1;
34+
}
35+
};

lcp/LCP 79. 提取咒文/Solution.go

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
func extractMantra(matrix []string, mantra string) (ans int) {
2+
m, n, l := len(matrix), len(matrix[0]), len(mantra)
3+
q := [][3]int{[3]int{0, 0, 0}}
4+
vis := make([][][]bool, m)
5+
for i := range vis {
6+
vis[i] = make([][]bool, n)
7+
for j := range vis[i] {
8+
vis[i][j] = make([]bool, l+1)
9+
}
10+
}
11+
vis[0][0][0] = true
12+
dirs := [5]int{-1, 0, 1, 0, -1}
13+
for ; len(q) > 0; ans++ {
14+
for size := len(q); size > 0; size-- {
15+
p := q[0]
16+
q = q[1:]
17+
i, j, k := p[0], p[1], p[2]
18+
if k == l {
19+
return ans
20+
}
21+
if matrix[i][j] == mantra[k] && !vis[i][j][k+1] {
22+
vis[i][j][k+1] = true
23+
q = append(q, [3]int{i, j, k + 1})
24+
} else {
25+
for c := 0; c < 4; c++ {
26+
x, y := i+dirs[c], j+dirs[c+1]
27+
if x >= 0 && x < m && y >= 0 && y < n && !vis[x][y][k] {
28+
vis[x][y][k] = true
29+
q = append(q, [3]int{x, y, k})
30+
}
31+
}
32+
}
33+
}
34+
}
35+
return -1
36+
}
+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
class Solution {
2+
public int extractMantra(String[] matrix, String mantra) {
3+
int m = matrix.length, n = matrix[0].length();
4+
int l = mantra.length();
5+
Deque<int[]> q = new ArrayDeque<>();
6+
q.offer(new int[] {0, 0, 0});
7+
boolean[][][] vis = new boolean[m][n][l + 1];
8+
vis[0][0][0] = true;
9+
int[] dirs = {-1, 0, 1, 0, -1};
10+
int ans = 0;
11+
for (; !q.isEmpty(); ++ans) {
12+
for (int size = q.size(); size > 0; --size) {
13+
var p = q.poll();
14+
int i = p[0], j = p[1], k = p[2];
15+
if (k == l) {
16+
return ans;
17+
}
18+
if (matrix[i].charAt(j) == mantra.charAt(k) && !vis[i][j][k + 1]) {
19+
vis[i][j][k + 1] = true;
20+
q.offer(new int[] {i, j, k + 1});
21+
} else {
22+
for (int c = 0; c < 4; ++c) {
23+
int x = i + dirs[c], y = j + dirs[c + 1];
24+
if (x >= 0 && x < m && y >= 0 && y < n && !vis[x][y][k]) {
25+
vis[x][y][k] = true;
26+
q.offer(new int[] {x, y, k});
27+
}
28+
}
29+
}
30+
}
31+
}
32+
return -1;
33+
}
34+
}

lcp/LCP 79. 提取咒文/Solution.py

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution:
2+
def extractMantra(self, matrix: List[str], mantra: str) -> int:
3+
m, n = len(matrix), len(matrix[0])
4+
q = deque([(0, 0, 0)])
5+
vis = {q[0]}
6+
dirs = (-1, 0, 1, 0, -1)
7+
ans = 0
8+
while q:
9+
for _ in range(len(q)):
10+
i, j, k = q.popleft()
11+
if k == len(mantra):
12+
return ans
13+
if matrix[i][j] == mantra[k]:
14+
t = (i, j, k + 1)
15+
if t not in vis:
16+
vis.add(t)
17+
q.append(t)
18+
else:
19+
for a, b in pairwise(dirs):
20+
x, y = i + a, j + b
21+
if 0 <= x < m and 0 <= y < n:
22+
t = (x, y, k)
23+
if t not in vis:
24+
vis.add(t)
25+
q.append(t)
26+
ans += 1
27+
return -1

lcp/LCP 79. 提取咒文/Solution.ts

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
function extractMantra(matrix: string[], mantra: string): number {
2+
const [m, n, l] = [matrix.length, matrix[0].length, mantra.length];
3+
const q: number[][] = [[0, 0, 0]];
4+
const vis: boolean[][][] = Array(m)
5+
.fill(0)
6+
.map(() =>
7+
Array(n)
8+
.fill(0)
9+
.map(() => Array(l + 1).fill(false)),
10+
);
11+
const dirs: number[] = [-1, 0, 1, 0, -1];
12+
let ans = 0;
13+
for (; q.length > 0; ++ans) {
14+
for (let size = q.length; size > 0; --size) {
15+
const [i, j, k] = q.shift()!;
16+
if (k === l) {
17+
return ans;
18+
}
19+
if (matrix[i][j] === mantra[k] && !vis[i][j][k + 1]) {
20+
vis[i][j][k + 1] = true;
21+
q.push([i, j, k + 1]);
22+
} else {
23+
for (let c = 0; c < 4; ++c) {
24+
const [x, y] = [i + dirs[c], j + dirs[c + 1]];
25+
if (x >= 0 && x < m && y >= 0 && y < n && !vis[x][y][k]) {
26+
vis[x][y][k] = true;
27+
q.push([x, y, k]);
28+
}
29+
}
30+
}
31+
}
32+
}
33+
return -1;
34+
}

solution/0800-0899/0834.Sum of Distances in Tree/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ function sumOfDistancesInTree(n: number, edges: number[][]): number[] {
257257
const dfs2 = (i: number, fa: number, t: number) => {
258258
ans[i] = t;
259259
for (const j of g[i]) {
260-
if (j != fa) {
260+
if (j !== fa) {
261261
dfs2(j, i, t - size[j] + n - size[j]);
262262
}
263263
}

solution/0800-0899/0834.Sum of Distances in Tree/README_EN.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ function sumOfDistancesInTree(n: number, edges: number[][]): number[] {
234234
const dfs2 = (i: number, fa: number, t: number) => {
235235
ans[i] = t;
236236
for (const j of g[i]) {
237-
if (j != fa) {
237+
if (j !== fa) {
238238
dfs2(j, i, t - size[j] + n - size[j]);
239239
}
240240
}

0 commit comments

Comments
 (0)