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

力扣3337. 字符串转换后的长度 II随笔

“生活并不照顾那些表现得过于疲惫的人。” ——弗里德里希·尼采

题目

给你一个由小写英文字母组成的字符串 s,一个整数 t 表示要执行的 转换 次数,以及一个长度为 26 的数组 nums。每次 转换 需要根据以下规则替换字符串 s 中的每个字符:

  • 将 s[i] 替换为字母表中后续的 nums[s[i] - 'a'] 个连续字符。例如,如果 s[i] = 'a' 且 nums[0] = 3,则字符 'a' 转换为它后面的 3 个连续字符,结果为 "bcd"
  • 如果转换超过了 'z',则 回绕 到字母表的开头。例如,如果 s[i] = 'y' 且 nums[24] = 3,则字符 'y' 转换为它后面的 3 个连续字符,结果为 "zab"

返回 恰好 执行 t 次转换后得到的字符串的 长度

由于答案可能非常大,返回其对 10^9+7 取余的结果。

难度:困难

分析

我们可以用一个长度为26的数组存储每种字符的个数,每次操作都更改了每种字符的个数,由于此题数据量较大,暴力模拟会超时,因此我们考虑使用矩阵进行运算。我们把统计字符的数据当作一个1*n的矩阵,因为转换规则不变,所以每次操作都是乘上一个相同的n*n的矩阵,我们可以更改运算顺序,先计算n*n的矩阵的t次幂再和1*n的矩阵相乘得到结果。我们可以参照快速幂的思想实现矩阵快速幂(见代码)。

解答

class Solution {public int lengthAfterTransformations(String s, int t, List<Integer> nums) {long[] count=new long[26];final int MOD=1000000007;for (int i=0;i<s.length();i++){count[s.charAt(i)-'a']++;}long[][] matrix=new long[26][26];for (int i=0;i<26;i++){for (int j=1;j<=nums.get(i);j++){int index=(i+j)%26;matrix[i][index]=1;}}// count * matrix t次 count中的值需要MOD// matrix t次快速幂matrix = rapid(matrix,t,MOD);long[] temp=new long[26];for (int i=0;i<26;i++){for (int j=0;j<26;j++){temp[i]=(temp[i]+count[j]*matrix[j][i])%MOD;}}count=temp;long ans=0;for (int i=0;i<26;i++){ans=(ans+count[i])%MOD;}return (int)ans;}private long[][] rapid(long[][] matrix, int t, int MOD){int n=matrix.length;long[][] ans=new long[n][n];for (int i=0;i<n;i++){ans[i][i]=1;}while (t>0){if ((t&1)==1){ans=multiply(ans,matrix,MOD);}matrix=multiply(matrix,matrix,MOD);t>>=1;}return ans;}private long[][] multiply(long[][] m1, long[][] m2, int MOD){int n=m1.length;long[][] ans=new long[n][n];for (int i=0;i<n;i++){for (int j=0;j<n;j++){for (int k=0;k<n;k++){ans[i][j]=(ans[i][j]+m1[i][k]*m2[k][j])%MOD;}}}return ans;}
}

“求知若渴,虚心若愚。”——史蒂夫·乔布斯

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

相关文章:

  • 2024年全国青少年信息素养大赛-算法创意实践C++ 华中赛区(初赛)历年真题
  • HTML5 浮动(Float)详解
  • 上海OA系统哪家好?厂商有哪些?
  • 如何在终端/命令行中把PDF的每一页转换成图片(PNG)
  • 从0开始学linux韦东山教程第三章问题小结(4)
  • 易学探索助手-个人记录(十)
  • redis 缓存穿透,缓存击穿,缓存雪崩
  • VCS X-PROP建模以及在方针中的应用
  • 利用vba替换word中多个表格,相邻单元格的文字
  • 用Array.from实现创建一个1-100的数组
  • 探索自我重复的奇妙之旅--递归
  • 最小区域法求平面度及八种算法思路
  • AI降重率工具推荐:提升论文原创度的利器
  • windows文件共享另一台电脑资源管理器网络文件夹无法找到机器
  • AI Agent开发第66课-彻底消除RAG知识库幻觉-带推理的RAG
  • 设计模式(9)——创建型模式之工厂方法
  • FlashInfer - SparseAttention(稀疏注意力)只计算部分有意义的注意力连接,而非全部 token 对
  • x-IMU matlab zupt惯性室内定位算法
  • 微服务调试问题总结
  • 数据预处理之数据平滑处理详解
  • 学习黑客蓝牙技术详解
  • 在K8S集群中部署EFK日志收集
  • 【LINUX操作系统】线程同步与互斥
  • 《Python星球日记》 第72天:问答系统与信息检索
  • VCS758电流传感器芯片:国产化替代与高精度电流检测解决方案
  • Elasticsearch索引设计与调优
  • 数字IC后端设计实现 | 如何自动删除Innovus 中冗余的hold buffer?
  • 季报中的FPGA行业:U型反转,春江水暖
  • 高压差分探头的阻抗选择
  • Apollo学习——键盘控制速度