classSolution: def minimumTimeToInitialState(self, word: str, k: int) -> int: mod =10**9 + 7 base = 31 n = len(word) h = [1] * (n + 1) arr = [0] * (n + 1) for i in range(n): h[i + 1] = (h[i] * base) % mod arr[i + 1] = (arr[i] * base + ord(word[i]) - ord('a')) % mod def get(i, j): return (arr[j + 1] - arr[i] * h[j - i + 1] % mod + mod) % mod ans = 1 for i in range(k, n, k): ifget(0, n - 1 - i) == get(i, n - 1): return ans ans += 1 return ans
3030. 找出网格的区域平均强度
给你一个下标从 0 开始、大小为 m x n 的网格 image ,表示一个灰度图像,其中 image[i][j] 表示在范围 [0..255] 内的某个像素强度。另给你一个 非负 整数 threshold 。
classSolution: defresultGrid(self, image: List[List[int]], threshold: int) -> List[List[int]]: m = len(image) n = len(image[0]) cnt = [[0] * (n + 1) for _ inrange(m + 1)] tot = [[0] * n for _ inrange(m)] psum = [[0] * n for _ inrange(m)]
for i inrange(m): for j inrange(n): cnt[i + 1][j + 1] = cnt[i + 1][j] + cnt[i][j + 1] + image[i][j] - cnt[i][j]
defcheck(i, j): if i < 0or j < 0or i + 2 >= m or j + 2 >= n: returnFalse for r inrange(3): for c inrange(3): if c > 0andabs(image[i + r][j + c] - image[i + r][j + c - 1]) > threshold: returnFalse if r > 0andabs(image[i + r][j + c] - image[i + r - 1][j + c]) > threshold: returnFalse returnTrue
res = [[0] * n for _ inrange(m)] for i inrange(m): for j inrange(n): if check(i, j): for x inrange(3): for y inrange(3): tot[i + x][j + y] += 1 psum[i + x][j + y] += get(i, j) // 9 if tot[i][j] == 0: res[i][j] = image[i][j] else: res[i][j] = psum[i][j] // tot[i][j] return res
3031. 将单词恢复初始状态所需的最短时间 II
给你一个下标从 0 开始的字符串 word 和一个整数 k 。
在每一秒,你必须执行以下操作:
移除 word 的前 k 个字符。
在 word 的末尾添加 k 个任意字符。
注意 添加的字符不必和移除的字符相同。但是,必须在每一秒钟都执行 两种 操作。
返回将 word 恢复到其 初始 状态所需的 最短 时间(该时间必须大于零)。
示例 1:
1 2 3 4 5 6
输入:word = "abacaba", k = 3 输出:2 解释: 第 1 秒,移除 word 的前缀 "aba",并在末尾添加 "bac" 。因此,word 变为 "cababac"。 第 2 秒,移除 word 的前缀 "cab",并在末尾添加 "aba" 。因此,word 变为 "abacaba" 并恢复到始状态。 可以证明,2 秒是 word 恢复到其初始状态所需的最短时间。
示例 2:
1 2 3 4 5
输入:word = "abacaba", k = 4 输出:1 解释: 第 1 秒,移除 word 的前缀 "abac",并在末尾添加 "caba" 。因此,word 变为 "abacaba" 并恢复到初始状态。 可以证明,1 秒是 word 恢复到其初始状态所需的最短时间。
示例 3:
1 2 3 4 5 6
输入:word = "abcbabcd", k = 2 输出:4 解释: 每一秒,我们都移除 word 的前 2 个字符,并在 word 末尾添加相同的字符。 4 秒后,word 变为 "abcbabcd" 并恢复到初始状态。 可以证明,4 秒是 word 恢复到其初始状态所需的最短时间。
classSolution: def minimumTimeToInitialState(self, word: str, k: int) -> int: mod =10**9 + 7 base = 31 n = len(word) h = [1] * (n + 1) arr = [0] * (n + 1) for i in range(n): h[i + 1] = (h[i] * base) % mod arr[i + 1] = (arr[i] * base + ord(word[i]) - ord('a')) % mod def get(i, j): return (arr[j + 1] - arr[i] * h[j - i + 1] % mod + mod) % mod ans = 1 for i in range(k, n, k): ifget(0, n - 1 - i) == get(i, n - 1): return ans ans += 1 return ans