← 返回目录

二、数据结构

第 40 / 74 卷日期:

二、数据结构

2.1图

算法笔试模拟题精解之“变换的密钥”

贡献者 | 黄信旭

简介:根据题意,只要根据给出的初始关系,计算出对于每个字母可以变成的字

母,就可以直接判断 s1 能不能转化成 s2 了。对于求幂操作有可以加快计算的方法,

叫做矩阵快速幂。这里用求数的次幂举例。

题目描述

题目等级:中等

知识点:广度优先搜索 /BFS、Floyed 最短路、图

查看题目:变换的密钥

Tom 最开始有一个密钥 s1,s1 是长度为 n 的由小写字母组成的字符串。Jerry

也有一个长度为 n 的由小写字母组成的密钥 s2。

现在有 m 组关系,每组关系由两个数字 [u,v] 构成 (1<=u,v<=26),表示 26 个

字母表中的第 u 个小写字母可以直接转换为第 v 个小写字母。

假设 u=1,v=2, 那么说明字母 'a' 可以直接转换为字母 'b'。现在 Tom 对于 s1

的每个字母使用无数次转换,请判断 s1 能否转换为 s2。

输入内容为四部分,第一部分为 n(1<=n<=100000),代表字符串的长度。接下

来两部分分别是长度为 n 的 s1,s2。

第四部分为 m(1 <=m <=325),代表关系个数。接下来是 m 组 [u,v] 关系。

如果 s1 能变成 s2, 则输出 YES, 否则输出 NO。

示例 1

输入:

6

"aabbcc"

"cdbcad"

4

[[1,3],[3,1],[1,4],[2,3]]

输出:

"YES"

注意

可以转换多次,比如 a 可以转换为 b,而 b 可以转换为 c,则 a 可以转换为 c。

样例:aabbcc->cabbcc->cdbbcc->cdbccc->cdbcac->cdbcaa->cdbcad

解题思路一:一般思路

根据题意,只要根据给出的初始关系,计算出对于每个字母可以变成的字母,就

可以直接判断 s1 能不能转化成 s2 了。

例如样例中计算过后

a -> a,c,d b -> b,c

c -> a,c,d d -> d

对于这个结果,可以使用一个 26*26 的二维数组 change 来保存。每一行表示

原始字母,每一列表示可以变换成的字母。1 表示可以变化,0 表示不能变换。

计算过程:

  1. 初始化,根据给出的关系填充数组
  2. 记得数组对角线要填为 1,表示每个字母可以不进行变换,是自己本身。
  3. 计算经过无数次变换后的数组。

对于第三步可以直接进行多次 for 循环,因为数组不大,一般不会超时。

方法二:矩阵快速幂

经过 0-2 次变换后可以达到的字母的结果相当于 change*change,0-3 次对

应的相当于 change*change*change,0-n 次对应的就是 change^n。这是一个矩

阵求幂的过程。

对于求幂操作有可以加快计算的方法,叫做矩阵快速幂。这里用求数的次幂举例。

假设要求 x^13。直接的方法是进行 12 次相乘。

我们可以观察到 13 = 8 + 4 + 1= 2^3 + 2^2 + 1

所以 x^13 = x^8 + x^4 + x= (x^4)^2 + (x^2)^2 + 0*(x)^2 + x

从右向左,每一项都是前一项的平方。这样原来需要 12 次乘法的操作变成了 3

次惩罚,3 次加法(第二项系数为 0,不用加)。

与求数的次幂类似,矩阵也可以用相同的方法加速计算。对于这道题本身,因为

矩阵中非 0 的结果表示可以进行变换,所以相乘时没有必要算出具体的值,只需要判

断结果是否非 0。

因为只有 26 个字母,所以只需要算到 26 次幂就可以了,也可以计算 32 次幂来

去掉加法的部分。

时间复杂度 O(5*26*26*26) 5 是求 32 次幂需要的矩阵乘法次数。26*26*26

是一次乘法需要的时间复杂度。

空间复杂度 O(2*26*26) 一个二维数组保存当前结果,一个保存相乘后的结果。

看完之后是不是有了想法了呢,快来练练手吧 >> 查看题目:变换的密钥

全站分卷索引 · 74 卷
  1. 1一、算法思想
  2. 2算法笔试模拟题精解之“打怪兽”
  3. 31.2 贪心
  4. 4算法笔试模拟题精解之“最强的团队”
  5. 5算法笔试模拟题精解之“Tom 爱吃巧克力”
  6. 6算法笔试模拟题精解之“吃奶酪”
  7. 7算法笔试模拟题精解之“一的个数”
  8. 8算法笔试模拟题精解之“Bob 的花束”
  9. 9算法笔试模拟题精解之“钱庄”
  10. 10算法笔试模拟题精解之“移动射击”
  11. 11算法笔试模拟题精解之“相似数组”
  12. 12算法笔试模拟题精解之“过吊桥”
  13. 13算法笔试模拟题精解之“完美排列”
  14. 14算法笔试模拟题精解之“采摘圣诞果”
  15. 15算法比赛模拟题精解之“Tairitsu and Dynamic Objects”
  16. 16算法笔试模拟题精解之“Codancer 的炸弹引爆”
  17. 17算法笔试模拟题精解之“学习小组”
  18. 18算法笔试模拟题精解之“恢复字符串”
  19. 191.3 DP/ 动态规划
  20. 20算法笔试模拟题精解之“寻找等比数列”
  21. 21算法笔试模拟题精解之“字符配对”
  22. 22算法笔试模拟题精解之“数组染色”
  23. 23算法笔试模拟题精解之“连绵的群山”
  24. 24算法笔试模拟题精解之“难住Tom 的问题”
  25. 25算法笔试模拟题精解之“变化的字符”
  26. 26算法笔试模拟题精解之“跳房子”
  27. 27算法笔试模拟题精解之“寒假活动”
  28. 28算法笔试模拟题精解之“最短路”
  29. 29算法笔试模拟题精解之“codancer 上楼”
  30. 30算法笔试模拟题精解之“木棒拼接”
  31. 31算法笔试模拟题精解之“Codancer 的数组封印”
  32. 32算法笔试模拟题精解之“Jerry 的异或运算”
  33. 33算法笔试模拟题精解之“小明的数学作业”
  34. 34算法笔试模拟题精解之“奇偶数列”
  35. 351.4 剪枝
  36. 361.5 尺取法
  37. 37算法笔试模拟题精解之“调整数组”
  38. 38算法笔试模拟题精解之“最优分组”
  39. 39算法笔试模拟题精解之“破译密码”
  40. 40二、数据结构
  41. 412.2 搜索
  42. 42算法笔试模拟题精解之“能量半径”
  43. 43算法笔试模拟题精解之“苹果收获程序”
  44. 44算法笔试模拟题精解之“恐怖的辐射”
  45. 45算法笔试模拟题精解之“树的拆分”
  46. 46算法笔试模拟题精解之“Password”
  47. 47算法笔试模拟题精解之“神奇数字在哪里”
  48. 48算法笔试模拟题精解之“神奇的棋子”
  49. 492.3 树
  50. 50算法笔试模拟题精解之“Codancer 的旅行”
  51. 51算法笔试模拟题精解之“Codancer 的求和”
  52. 52算法笔试模拟题精解之“找出二叉搜索树的第2 大的数”
  53. 532.4 线型
  54. 54算法笔试模拟题精解之“最活跃的数”
  55. 55算法笔试模拟题精解之“非递减序列”
  56. 56算法笔试模拟题精解之“Tom 跳方格”
  57. 57算法笔试模拟题精解之“复杂的字符串”
  58. 58算法笔试模拟题精解之“神秘消失”
  59. 59三、计算
  60. 60算法笔试模拟题精解之“简单题?
  61. 61算法笔试模拟题精解之“朋友一生一起走”
  62. 62算法笔试模拟题精解之“正三角塔”
  63. 63算法笔试模拟题精解之“组队难题”
  64. 64算法笔试模拟题精解之“2n 合体”
  65. 65算法笔试模拟题精解之“平行线”
  66. 66算法笔试模拟题精解之“叠叠高”
  67. 67算法笔试模拟题精解之“公平”
  68. 68算法笔试模拟题精解之“Tom 的手工课”
  69. 69算法笔试模拟题精解之“填数问题”
  70. 70算法笔试模拟题精解之“Jerry 的考验”
  71. 71算法笔试模拟题精解之“超车”
  72. 72算法笔试模拟题精解之“坏掉的时钟”
  73. 73算法笔试模拟题精解之“期末考试”
  74. 74算法笔试模拟题精解之“滑雪比赛”