尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Kimi 思考 LeetCode 3337. 字符串转换后的长度 II Java实现

Kimi 思考    LeetCode 3337. 字符串转换后的长度 II Java实现 以下是 LeetCode 3337「字符串转换后的长度 II」的 Java 实现采用矩阵快速幂优化递推javaimport java.util.List;class Solution {private static final int MOD (int) 1e9 7;private static final int M 26;public int lengthAfterTransformations(String s, int t, ListInteger nums) {// 统计初始字符串中每个字母的出现次数int[] cnt new int[M];for (char c : s.toCharArray()) {cnt[c - a];}// 构建 26x26 的转移矩阵// matrix[i][j] 1 表示字母 i 经过一次转换可以变成字母 jint[][] matrix new int[M][M];for (int i 0; i M; i) {int num nums.get(i);for (int j 1; j num; j) {matrix[i][(i j) % M] 1;}}// 计算转移矩阵的 t 次幂int[][] factor matpow(matrix, t);// 向量乘以矩阵int[] result vectorMatrixMultiply(cnt, factor);// 最终答案为所有字母数量之和int ans 0;for (int val : result) {ans (ans val) % MOD;}return ans;}// 矩阵乘法带模运算跳过0元素优化private int[][] matmul(int[][] a, int[][] b) {int n a.length;int p b.length;int q b[0].length;int[][] res new int[n][q];for (int i 0; i n; i) {for (int k 0; k p; k) {if (a[i][k] 0) continue;for (int j 0; j q; j) {res[i][j] (int) ((res[i][j] 1L * a[i][k] * b[k][j]) % MOD);}}}return res;}// 矩阵快速幂private int[][] matpow(int[][] mat, int power) {int[][] res new int[M][M];// 初始化为单位矩阵for (int i 0; i M; i) {res[i][i] 1;}while (power 0) {if ((power 1) ! 0) {res matmul(res, mat);}mat matmul(mat, mat);power 1;}return res;}// 行向量1x26乘以矩阵26x26private int[] vectorMatrixMultiply(int[] vector, int[][] matrix) {int[] result new int[M];for (int i 0; i M; i) {long sum 0;for (int j 0; j M; j) {sum (sum 1L * vector[j] * matrix[j][i]) % MOD;}result[i] (int) sum;}return result;}}核心思路1. 状态定义令 f[i][j] 表示经过 i 次转换后第 j 个字母a0, ..., z25的个数。初始时 f[0][j] 就是字符串 s 中各字母的频次。2. 转移矩阵构造一个 26×26 的矩阵 matrix其中 matrix[i][j] 1 当且仅当字母 i 经过一次转换能生成字母 j。根据题意字母 i 会生成 nums[i] 个后续连续字母循环即 i1, i2, ..., inums[i]模 26。3. 矩阵快速幂由于 t 最大可达 10^9直接递推会超时。利用矩阵乘法的结合律通过快速幂在 O(log t × 26³) 的时间内计算出 matrix^t。4. 计算结果初始频次向量1×26乘以 matrix^t得到 t 次转换后的各字母数量求和即为最终字符串长度。复杂度- 时间复杂度O(|s| log t × 26³)其中 |s| ≤ 10⁵- 空间复杂度O(26²)即常数级空间
返回列表