leetcode 模版

编程常用模版

leetcode_模版

KMP 模版(KMP算法是一种字符串匹配算法,可以在O(n+m) 的时间复杂度内实现两个字符串的匹配)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# KMP 模板
def calc_max_match(self, s: str) -> List[int]:
match = [0] * len(s)
c = 0
for i in range(1, len(s)):
v = s[i]
while c and s[c] != v:
c = match[c - 1]
if s[c] == v:
c += 1
match[i] = c
return match

# KMP 模板
# 返回 text 中出现了多少次 pattern(允许 pattern 重叠)
def kmp_search(self, text: str, pattern: str) -> int:
match = self.calc_max_match(pattern)
match_cnt = c = 0
for i, v in enumerate(text):
v = text[i]
while c and pattern[c] != v:
c = match[c - 1]
if pattern[c] == v:
c += 1
if c == len(pattern):
match_cnt += 1
c = match[c - 1]
return match_cnt


作者:灵茶山艾府
链接:https://leetcode.cn/problems/string-transformation/solutions/2435348/kmp-ju-zhen-kuai-su-mi-you-hua-dp-by-end-vypf/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

快速幂 模版(实现快速计算某个元素的幂)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    # 矩阵乘法
def multiply(self, a: List[List[int]], b: List[List[int]]) -> List[List[int]]:
c = [[0, 0], [0, 0]]
for i in range(2):
for j in range(2):
c[i][j] = (a[i][0] * b[0][j] + a[i][1] * b[1][j]) % (10 ** 9 + 7)
return c

# 矩阵快速幂
def pow(self, a: List[List[int]], n: int) -> List[List[int]]:
res = [[1, 0], [0, 1]]
while n:
if n % 2:
res = self.multiply(res, a)
a = self.multiply(a, a)
n //= 2
return res

作者:灵茶山艾府
链接:https://leetcode.cn/problems/string-transformation/solutions/2435348/kmp-ju-zhen-kuai-su-mi-you-hua-dp-by-end-vypf/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者

Lookup

发布于

2099-08-28

更新于

2023-09-14

许可协议