3337. 字符串转换后的长度 II
3337. 字符串转换后的长度 II
# 定义了一个大质数 MOD,用于取模运算,防止数值溢出。
MOD = 1_000_000_007# 矩阵乘法 mul
def mul(a:List[List[int]], b:List[List[int]]) -> List[List[int]]:# 输入两个矩阵 a 和 b,返回它们的矩阵乘积 a @ b。# 使用列表推导式计算矩阵乘法的每个元素,并对结果取模。return [[sum(x * y for x, y in zip(row, col)) % MOD for col in zip(*b)]for row in a] # 矩阵快速幂 pow_mul
def pow_mul(a: List[List[int]], n: int, f0: List[List[int]]) -> List[List[int]]:res = f0while n:if n & 1:res = mul(a, res)a = mul(a, a)n >>= 1return resclass Solution:def lengthAfterTransformations(self, s: str, t: int, nums: List[int]) -> int:SIZE = 26f0 = [[1] for _ in range(SIZE)]m = [[0] * SIZE for _ in range(SIZE)]for i, c in enumerate(nums):for j in range(i + 1, i + c + 1):m[i][j % SIZE] = 1mt = pow_mul(m, t, f0)ans = 0for ch, cnt in Counter(s).items():ans += mt[ord(ch) - ord('a')][0] * cntreturn ans % MOD
[sum(x * y for x, y in zip(row, col)) % MOD for col in zip(*b) 解析
这段代码是一个列表推导式,用于计算两个矩阵(或二维数组)的乘积后对每个元素取模.
1. 外层结构:列表推导式
这是一个列表推导式,它会遍历 zip(*b)
的每一个元素(命名为 col
),然后计算 sum(x * y for x, y in zip(row, col)) % MOD
,最终将所有结果组成一个列表返回。
2. zip(*b)
:矩阵转置
b
是一个二维数组(矩阵),zip(*b)
是 Python 中矩阵转置的惯用写法。-
它会返回一个迭代器,每次迭代得到的是b = [[1, 2, 3],[4, 5, 6]] zip(*b) # 相当于 zip([1, 4], [2, 5], [3, 6])
b
的一列(即[1, 4]
,[2, 5]
,[3, 6]
)。
3. sum(x * y for x, y in zip(row, col))
:点积计算
row
是矩阵a
的某一行,col
是矩阵b
的某一列(因为zip(*b)
是转置后的列)。zip(row, col)
将row
和col
的对应元素配对,例如:row = [1, 2, 3] col = [4, 5, 6] zip(row, col) # 生成 (1, 4), (2, 5), (3, 6)
x * y for x, y in zip(row, col)
计算每对元素的乘积(即1 * 4
,2 * 5
,3 * 6
)。sum(...)
将这些乘积相加,得到点积(即1 * 4 + 2 * 5 + 3 * 6 = 32
)。
4. % MOD
:取模运算
- 对点积结果取模(
% MOD
),确保结果在[0, MOD-1]
范围内。
5. 整体逻辑
这段代码的作用是:
- 遍历矩阵
b
的每一列col
。 - 计算矩阵
a
的某一行row
与col
的点积。 - 对点积结果取模
MOD
。 - 将所有结果组成列表返回。
row = [1, 2, 3]
b = [[4, 5, 6],[7, 8, 9]]
MOD = 10
计算过程:
zip(*b)
得到[4, 7]
,[5, 8]
,[6, 9]
(即b
的列)。- 对每一列
col
:col = [4, 7]
:sum(1 * 4 + 2 * 7) = 18
,18 % 10 = 8
col = [5, 8]
:sum(1 * 5 + 2 * 8) = 21
,21 % 10 = 1
col = [6, 9]
:sum(1 * 6 + 2 * 9) = 24
,24 % 10 = 4
- 最终结果:
[8, 1, 4]
这段代码实现了:
- 矩阵
a
的一行row
与矩阵b
的每一列的点积。 - 对每个点积结果取模
MOD
。 - 返回结果列表。
常用于矩阵乘法或线性代数运算中。