【发布时间】:2022-01-16 11:00:46
【问题描述】:
我在进行矩阵模式匹配技术面试时遇到了一个问题。我能够使用蛮力解决问题,但想知道是否有更有效的解决方案,因为我只获得了大约一半的效率。非常感谢您的意见。
给定一个包含数字 0, 1, 2 和模式 [1, 2, 0, 2, 0, 2, 0] 的矩阵,从矩阵中的任意点开始找到匹配模式的最大长度,但只能沿对角线行驶。
这是我们期望函数返回 12 的示例。
这是我们期望函数返回 7 的地方。
空矩阵应该返回 0。
这是我的代码,就像我之前所说的那样,它确实有效并通过了所有测试,但我得到了停靠点。
def max_diagonal_match(matrix) -> int:
max_len = 0
pattern_match = [1, 2, 0, 2, 0, 2, 0]
for i in range(0, len(matrix)):
for j in range(0, len(matrix[i])):
max_len = max(
max_len,
find_i_minus_j_minus(matrix, i, j, pattern_match, 7),
find_i_minus_j_plus(matrix, i, j, pattern_match, 7),
find_i_plus_j_minus(matrix, i, j, pattern_match, 7),
find_i_plus_j_plus(matrix, i, j, pattern_match, 7)
)
return max_len
# i-, j-
def find_i_minus_j_minus(matrix, i, j, pattern, mod):
count = 0
while i >= 0 and j >= 0:
if matrix[i][j] != pattern[count % mod]:
return count
count += 1
i -= 1
j -= 1
return count
# i-, j+
def find_i_minus_j_plus(matrix, i, j, pattern, mod):
count = 0
while i >= 0 and j < len(matrix[i]):
if matrix[i][j] != pattern[count % mod]:
return count
count += 1
i -= 1
j += 1
return count
# i+, j-
def find_i_plus_j_minus(matrix, i, j, pattern, mod):
count = 0
while i < len(matrix) and j >= 0:
if matrix[i][j] != pattern[count % mod]:
return count
count += 1
i += 1
j -= 1
return count
# j+, i+
def find_i_plus_j_plus(matrix, i, j, pattern, mod):
count = 0
while i < len(matrix) and j < len(matrix[i]):
if matrix[i][j] != pattern[count % mod]:
return count
count += 1
i += 1
j += 1
return count
非常感谢您花时间阅读,非常感谢您的任何意见。
【问题讨论】:
-
匹配是否必须从模式的开头开始,或者它可以是一部分?
标签: python python-3.x algorithm matrix string-matching