当前位置: 首页 > news >正文

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 * 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. 返回结果列表。

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

http://www.xdnf.cn/news/441955.html

相关文章:

  • 【更新】全国省市县-公开手机基站数据集(2006-2025.3)
  • NVMe简介2
  • UniApp 微信小程序绑定动态样式 :style 避坑指南
  • 电脑开机提示按f1原因分析及解决方法(6种解决方法)
  • Baklib内容中台AI革新智能服务实践
  • 【评测】免费体验dify工作流模式下腾讯语音转文字speech2text服务
  • 软件逆向基础-CE篇
  • 剖析提示词工程中的递归提示
  • 安全合规检查开源项目ComplianceAsCode/content详解及操作系统新产品开发适配指南
  • upload-labs通关笔记-第5关 文件上传之.ini绕过
  • 探索AI新领域:生成式人工智能认证(GAI认证)助力职场发展
  • 全流量解析:让安全防御从“被动挨打”升级为“主动狩猎”
  • 一分钟了解大语言模型(LLMs)
  • 濒危仙草的重生叙事:九仙尊米斛花节如何以雅集重构中医药文化IP
  • NNLM神经网络语言模型总结
  • react中安装依赖时的问题 【集合】
  • Android Studio Meerkat与Gradle构建工具升级实战指南
  • 2025年中国主流DevOps平台对比分析:Gitee、阿里云效与GitLab CE的技术适配与合规实践全景解读
  • excel使用笔记
  • Qt笔记---》.pro中配置
  • 【IDEA】注释配置
  • 西门子WinCC Unified PC的GraphQL使用手册
  • 常见排序算法及其java实现
  • 《Python星球日记》 第69天:生成式模型(GPT 系列)
  • JVM学习专题(二)内存模型深度剖析
  • STMCubeMX使用TB6612驱动编码轮并进行测速
  • 微信开发者工具里面模拟操作返回、录屏、网络速度、截屏等操作
  • 94. 二叉树的中序遍历详解:迭代法核心逻辑与出入栈模拟
  • 关于数据湖和数据仓的一些概念
  • 深入解析JVM字节码解释器执行流程(OpenJDK 17源码实现)