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 = f0
    while n:
        if n & 1:
            res = mul(a, res)
        a = mul(a, a)
        n >>= 1
    return res

class Solution:
    def lengthAfterTransformations(self, s: str, t: int, nums: List[int]) -> int:
        SIZE = 26
        f0 = [[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] = 1
        mt = pow_mul(m, t, f0)

        ans = 0
        for ch, cnt in Counter(s).items():
            ans += mt[ord(ch) - ord('a')][0] * cnt
        return 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 * 42 * 53 * 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

计算过程:

  1. zip(*b) 得到 [4, 7][5, 8][6, 9](即 b 的列)。
  2. 对每一列 col
    • col = [4, 7]sum(1 * 4 + 2 * 7) = 1818 % 10 = 8
    • col = [5, 8]sum(1 * 5 + 2 * 8) = 2121 % 10 = 1
    • col = [6, 9]sum(1 * 6 + 2 * 9) = 2424 % 10 = 4
  3. 最终结果:[8, 1, 4]

这段代码实现了:

  1. 矩阵 a 的一行 row 与矩阵 b 的每一列的点积。
  2. 对每个点积结果取模 MOD
  3. 返回结果列表。

常用于矩阵乘法或线性代数运算中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值