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

简介: 根据题意,只要根据给出的初始关系,计算出对于每个字母可以变成的字母,就可以直接判断s1能不能转化成s2了。对于求幂操作有可以加快计算的方法,叫做矩阵快速幂。这里用求数的次幂举例。

在线编程介绍

阿里云开发者社区在线编程产品,针对广大开发者学习、实践、面试、应聘、考试认证等打造的免费在线刷题神器。题库来自笔试模拟题、算法大赛模拟题等,界面整洁明了,操作简单,为用户营造专心答题的学习环境。点击链接开始体验:https://developer.aliyun.com/coding

本文为大家介绍其中的第58题:变换的密钥 的题目解析,具体如下:

题目描述

题目等级:中等
知识点:广度优先搜索/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) 一个二维数组保存当前结果,一个保存相乘后的结果。

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

相关文章
|
6月前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
6月前
|
算法 计算机视觉
【MATLAB 】 EMD信号分解+希尔伯特黄变换+边际谱算法
【MATLAB 】 EMD信号分解+希尔伯特黄变换+边际谱算法
187 0
|
3月前
|
算法
基于小波变换的图像自适应增强算法
基于小波变换的图像自适应增强算法
17 0
|
5月前
|
机器学习/深度学习 算法
基于BP神经网络和小波变换特征提取的烟草香型分类算法matlab仿真,分为浓香型,清香型和中间香型
```markdown 探索烟草香型分类:使用Matlab2022a中的BP神经网络结合小波变换。小波分析揭示香气成分的局部特征,降低维度,PCA等用于特征选择。BP网络随后处理这些特征,以区分浓香、清香和中间香型。 ```
|
6月前
|
算法 数据安全/隐私保护 C++
基于二维CS-SCHT变换和扩频方法的彩色图像水印嵌入和提取算法matlab仿真
该内容是关于一个图像水印算法的描述。在MATLAB2022a中运行,算法包括水印的嵌入和提取。首先,RGB图像转换为YUV格式,然后水印通过特定规则嵌入到Y分量中,并经过Arnold置乱增强安全性。水印提取时,经过逆过程恢复,使用了二维CS-SCHT变换和噪声对比度(NC)计算来评估水印的鲁棒性。代码中展示了从RGB到YUV的转换、水印嵌入、JPEG压缩攻击模拟以及水印提取的步骤。
|
5月前
|
算法 计算机视觉
图像处理之基于采样距离变换算法
图像处理之基于采样距离变换算法
36 0
|
6月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于DCT变换和位平面分解的数字水印嵌入提取算法matlab仿真
这是一个关于数字水印算法的摘要:使用MATLAB2022a实现,结合DCT和位平面分解技术。算法先通过DCT变换将图像转至频域,随后利用位平面分解嵌入水印,确保在图像处理后仍能提取。核心程序包括水印嵌入和提取,以及性能分析部分,通过PSNR和NC指标评估水印在不同噪声条件下的鲁棒性。
|
6月前
|
算法 搜索推荐 Java
Java数据结构 -- 常见算法分析(查找算法、排序算法)精解详解!!!
Java数据结构 -- 常见算法分析(查找算法、排序算法)精解详解!!!
60 0
|
6月前
|
算法 安全 网络协议
https原理--RSA密钥协商算法
https原理--RSA密钥协商算法
84 0
|
6月前
|
算法 数据安全/隐私保护 计算机视觉
基于DCT变换的彩色图像双重水印嵌入和提取算法matlab仿真
**算法摘要:** - 图形展示:展示灰度与彩色图像水印应用,主辅水印嵌入。 - 软件环境:MATLAB 2022a。 - 算法原理:双重水印,转换至YCbCr/YIQ,仅影响亮度;图像分割为M×N块,DCT变换后嵌入水印。 - 流程概览:两步水印嵌入,每步对应不同图示表示。 - 核心代码未提供。