本题是在大字符矩阵里找小矩形是否作为子矩阵出现,要求返回行优先的第一个左上角。数据到 300×300,逐格对比子块会超时,用 二维字符串哈希 + 二维前缀 做到 O(1) 询问。
给矩阵 g 定义:
h[i][j]=x=0∑i−1y=0∑j−1g[x][y]⋅Pi−1−x⋅Qj−1−y周末做饼干时,大烤盘 tray 被划成 m 行 n 列,每个格子上印着一个大写字母花纹。手里还有一块小模具 stamp,是 a 行 b 列的矩形花纹。要把模具原样、不旋转扣到烤盘上,模具覆盖的格子必须与烤盘上对应位置的字母完全一致。
请找到一次合法扣放的左上角坐标。若有多个位置都能扣上,返回从上到下、同一行再从左到右的第一个(即行号最小,行号相同则列号最小)。下标从 0 计。如果怎么扣都对不上,返回 [-1, -1]。
注意:这里找的是整块矩形是否作为子矩阵出现,不是在格子上拐弯走路径。
请实现:
findStampPos(tray: str[][], stamp: str[][]) -> int[]
返回长度为 2 的数组 [row, col]。
两行:
tray,形如 [["A", "B"], ["C", "D"]]stamp,格式相同每个元素都是单个大写字母 A~Z。两张表每行内部等长。
约束:
一个长度为 2 的整数数组:左上角坐标,或 [-1, -1]。
输入:
[["A", "B", "C"], ["D", "E", "F"], ["G", "H", "I"]]
[["E", "F"], ["H", "I"]]
输出:
[1, 1]
说明:模具对上烤盘右下 2 \times 2 那一块,左上角是 (1, 1)。
输入:
[["A", "A", "A"], ["A", "A", "B"]]
[["A", "A"]]
输出:
[0, 0]
说明:(0, 0)、(0, 1)、(1, 0) 都能扣上,取最先扫到的 (0, 0)。
输入:
[["A", "B"], ["C", "D"]]
[["B", "A"]]
输出:
[-1, -1]
说明:烤盘里没有与 [["B", "A"]] 完全相同的 1 \times 2 子块(不能旋转模具)。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册