Skip to content

Commit 5749568

Browse files
authored
feat: add solutions to lc problem: No.3078 (doocs#2441)
No.3078.Match Alphanumerical Pattern in Matrix I
1 parent abedc9f commit 5749568

File tree

9 files changed

+982
-0
lines changed

9 files changed

+982
-0
lines changed

solution/3000-3099/3078.Match Alphanumerical Pattern in Matrix I/README.md

Lines changed: 394 additions & 0 deletions
Large diffs are not rendered by default.

solution/3000-3099/3078.Match Alphanumerical Pattern in Matrix I/README_EN.md

Lines changed: 392 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
class Solution {
2+
public:
3+
vector<int> findPattern(vector<vector<int>>& board, vector<string>& pattern) {
4+
int m = board.size(), n = board[0].size();
5+
int r = pattern.size(), c = pattern[0].size();
6+
auto check = [&](int i, int j) {
7+
vector<int> d1(26, -1);
8+
vector<int> d2(10, -1);
9+
for (int a = 0; a < r; ++a) {
10+
for (int b = 0; b < c; ++b) {
11+
int x = i + a, y = j + b;
12+
if (isdigit(pattern[a][b])) {
13+
int v = pattern[a][b] - '0';
14+
if (v != board[x][y]) {
15+
return false;
16+
}
17+
} else {
18+
int v = pattern[a][b] - 'a';
19+
if (d1[v] != -1 && d1[v] != board[x][y]) {
20+
return false;
21+
}
22+
if (d2[board[x][y]] != -1 && d2[board[x][y]] != v) {
23+
return false;
24+
}
25+
d1[v] = board[x][y];
26+
d2[board[x][y]] = v;
27+
}
28+
}
29+
}
30+
return true;
31+
};
32+
for (int i = 0; i < m - r + 1; ++i) {
33+
for (int j = 0; j < n - c + 1; ++j) {
34+
if (check(i, j)) {
35+
return {i, j};
36+
}
37+
}
38+
}
39+
return {-1, -1};
40+
}
41+
};
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
func findPattern(board [][]int, pattern []string) []int {
2+
m, n := len(board), len(board[0])
3+
r, c := len(pattern), len(pattern[0])
4+
check := func(i, j int) bool {
5+
d1 := [26]int{}
6+
d2 := [10]int{}
7+
for a := 0; a < r; a++ {
8+
for b := 0; b < c; b++ {
9+
x, y := i+a, j+b
10+
if pattern[a][b] >= '0' && pattern[a][b] <= '9' {
11+
v := int(pattern[a][b] - '0')
12+
if v != board[x][y] {
13+
return false
14+
}
15+
} else {
16+
v := int(pattern[a][b] - 'a')
17+
if d1[v] > 0 && d1[v]-1 != board[x][y] {
18+
return false
19+
}
20+
if d2[board[x][y]] > 0 && d2[board[x][y]]-1 != v {
21+
return false
22+
}
23+
d1[v] = board[x][y] + 1
24+
d2[board[x][y]] = v + 1
25+
}
26+
}
27+
}
28+
return true
29+
}
30+
for i := 0; i < m-r+1; i++ {
31+
for j := 0; j < n-c+1; j++ {
32+
if check(i, j) {
33+
return []int{i, j}
34+
}
35+
}
36+
}
37+
return []int{-1, -1}
38+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
class Solution {
2+
public int[] findPattern(int[][] board, String[] pattern) {
3+
int m = board.length, n = board[0].length;
4+
int r = pattern.length, c = pattern[0].length();
5+
for (int i = 0; i < m - r + 1; ++i) {
6+
for (int j = 0; j < n - c + 1; ++j) {
7+
if (check(board, pattern, i, j)) {
8+
return new int[] {i, j};
9+
}
10+
}
11+
}
12+
return new int[] {-1, -1};
13+
}
14+
15+
private boolean check(int[][] board, String[] pattern, int i, int j) {
16+
int[] d1 = new int[26];
17+
int[] d2 = new int[10];
18+
Arrays.fill(d1, -1);
19+
Arrays.fill(d2, -1);
20+
for (int a = 0; a < pattern.length; ++a) {
21+
for (int b = 0; b < pattern[0].length(); ++b) {
22+
int x = i + a, y = j + b;
23+
if (Character.isDigit(pattern[a].charAt(b))) {
24+
int v = pattern[a].charAt(b) - '0';
25+
if (v != board[x][y]) {
26+
return false;
27+
}
28+
} else {
29+
int v = pattern[a].charAt(b) - 'a';
30+
if (d1[v] != -1 && d1[v] != board[x][y]) {
31+
return false;
32+
}
33+
if (d2[board[x][y]] != -1 && d2[board[x][y]] != v) {
34+
return false;
35+
}
36+
d1[v] = board[x][y];
37+
d2[board[x][y]] = v;
38+
}
39+
}
40+
}
41+
return true;
42+
}
43+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution:
2+
def findPattern(self, board: List[List[int]], pattern: List[str]) -> List[int]:
3+
def check(i: int, j: int) -> bool:
4+
d1 = {}
5+
d2 = {}
6+
for a in range(r):
7+
for b in range(c):
8+
x, y = i + a, j + b
9+
if pattern[a][b].isdigit():
10+
if int(pattern[a][b]) != board[x][y]:
11+
return False
12+
else:
13+
if pattern[a][b] in d1 and d1[pattern[a][b]] != board[x][y]:
14+
return False
15+
if board[x][y] in d2 and d2[board[x][y]] != pattern[a][b]:
16+
return False
17+
d1[pattern[a][b]] = board[x][y]
18+
d2[board[x][y]] = pattern[a][b]
19+
return True
20+
21+
m, n = len(board), len(board[0])
22+
r, c = len(pattern), len(pattern[0])
23+
for i in range(m - r + 1):
24+
for j in range(n - c + 1):
25+
if check(i, j):
26+
return [i, j]
27+
return [-1, -1]
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
function findPattern(board: number[][], pattern: string[]): number[] {
2+
const m: number = board.length;
3+
const n: number = board[0].length;
4+
const r: number = pattern.length;
5+
const c: number = pattern[0].length;
6+
7+
const check = (i: number, j: number): boolean => {
8+
const d1: number[] = Array(26).fill(-1);
9+
const d2: number[] = Array(10).fill(-1);
10+
11+
for (let a = 0; a < r; ++a) {
12+
for (let b = 0; b < c; ++b) {
13+
const x: number = i + a;
14+
const y: number = j + b;
15+
16+
if (!isNaN(Number(pattern[a][b]))) {
17+
const v: number = Number(pattern[a][b]);
18+
if (v !== board[x][y]) {
19+
return false;
20+
}
21+
} else {
22+
const v: number = pattern[a].charCodeAt(b) - 'a'.charCodeAt(0);
23+
if (d1[v] !== -1 && d1[v] !== board[x][y]) {
24+
return false;
25+
}
26+
if (d2[board[x][y]] !== -1 && d2[board[x][y]] !== v) {
27+
return false;
28+
}
29+
d1[v] = board[x][y];
30+
d2[board[x][y]] = v;
31+
}
32+
}
33+
}
34+
return true;
35+
};
36+
37+
for (let i = 0; i < m - r + 1; ++i) {
38+
for (let j = 0; j < n - c + 1; ++j) {
39+
if (check(i, j)) {
40+
return [i, j];
41+
}
42+
}
43+
}
44+
return [-1, -1];
45+
}

solution/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3088,6 +3088,7 @@
30883088
| 3075 | [幸福值最大化的选择方案](/solution/3000-3099/3075.Maximize%20Happiness%20of%20Selected%20Children/README.md) | `贪心`,`数组`,`排序` | 中等 | 第 388 场周赛 |
30893089
| 3076 | [数组中的最短非公共子字符串](/solution/3000-3099/3076.Shortest%20Uncommon%20Substring%20in%20an%20Array/README.md) | `字典树`,`数组`,`哈希表`,`字符串` | 中等 | 第 388 场周赛 |
30903090
| 3077 | [K 个不相交子数组的最大能量值](/solution/3000-3099/3077.Maximum%20Strength%20of%20K%20Disjoint%20Subarrays/README.md) | `数组`,`动态规划`,`前缀和` | 困难 | 第 388 场周赛 |
3091+
| 3078 | [Match Alphanumerical Pattern in Matrix I](/solution/3000-3099/3078.Match%20Alphanumerical%20Pattern%20in%20Matrix%20I/README.md) | | 中等 | 🔒 |
30913092

30923093
## 版权
30933094

solution/README_EN.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3086,6 +3086,7 @@ Press <kbd>Control</kbd> + <kbd>F</kbd>(or <kbd>Command</kbd> + <kbd>F</kbd> on
30863086
| 3075 | [Maximize Happiness of Selected Children](/solution/3000-3099/3075.Maximize%20Happiness%20of%20Selected%20Children/README_EN.md) | `Greedy`,`Array`,`Sorting` | Medium | Weekly Contest 388 |
30873087
| 3076 | [Shortest Uncommon Substring in an Array](/solution/3000-3099/3076.Shortest%20Uncommon%20Substring%20in%20an%20Array/README_EN.md) | `Trie`,`Array`,`Hash Table`,`String` | Medium | Weekly Contest 388 |
30883088
| 3077 | [Maximum Strength of K Disjoint Subarrays](/solution/3000-3099/3077.Maximum%20Strength%20of%20K%20Disjoint%20Subarrays/README_EN.md) | `Array`,`Dynamic Programming`,`Prefix Sum` | Hard | Weekly Contest 388 |
3089+
| 3078 | [Match Alphanumerical Pattern in Matrix I](/solution/3000-3099/3078.Match%20Alphanumerical%20Pattern%20in%20Matrix%20I/README_EN.md) | | Medium | 🔒 |
30893090

30903091
## Copyright
30913092

0 commit comments

Comments
 (0)