算法学习第一天2023.10.8(自用)

解码斜向换位密码

字符串 originalText 使用 斜向换位密码 ,经由 行数固定 为 rows 的矩阵辅助,加密得到一个字符串 encodedText 。

originalText 先按从左上到右下的方式放置到矩阵中。

先填充蓝色单元格,接着是红色单元格,然后是黄色单元格,以此类推,直到到达 originalText 末尾。箭头指示顺序即为单元格填充顺序。所有空单元格用 ' ' 进行填充。矩阵的列数需满足:用 originalText 填充之后,最右侧列 不为空 。

接着按行将字符附加到矩阵中,构造 encodedText 。

先把蓝色单元格中的字符附加到 encodedText 中,接着是红色单元格,最后是黄色单元格。箭头指示单元格访问顺序。

例如,如果 originalText = "cipher" 且 rows = 3 ,那么我们可以按下述方法将其编码:

蓝色箭头标识 originalText 是如何放入矩阵中的,红色箭头标识形成 encodedText 的顺序。在上述例子中,encodedText = "ch   ie   pr" 。

给你编码后的字符串 encodedText 和矩阵的行数 rows ,返回源字符串 originalText 。

注意:originalText  含任何尾随空格 ' ' 。生成的测试用例满足 仅存在一个 可能的 originalText 。

示例 1:

输入:encodedText = "ch   ie   pr", rows = 3
输出:"cipher"
解释:此示例与问题描述中的例子相同。

示例 2:

输入:encodedText = "iveo    eed   l te   olc", rows = 4
输出:"i love leetcode"
解释:上图标识用于编码 originalText 的矩阵。 
蓝色箭头展示如何从 encodedText 找到 originalText 。

示例 3:

输入:encodedText = "coding", rows = 1
输出:"coding"
解释:由于只有 1 行,所以 originalText 和 encodedText 是相同的。

示例 4:

输入:encodedText = " b  ac", rows = 2
输出:" abc"
解释:originalText 不能含尾随空格,但它可能会有一个或者多个前置空格。

提示:

  • 0 <= encodedText.length <= 106
  • encodedText 仅由小写英文字母和 ' ' 组成
  • encodedText 是对某个 不含 尾随空格的 originalText 的一个有效编码
  • 1 <= rows <= 1000
  • 生成的测试用例满足 仅存在一个 可能的 originalText

官方题解代码(c++)

class Solution {
public:
   string decodeCiphertext(string encodedText, int rows) {
       int cols = encodedText.size() / rows;   // 辅助矩阵的列数(编码后的文本被假设为一个矩阵,其中行数由传入的rows参数确定,而列数通过将编码文本的长度除以行数来计算)
       string res;   // 遍历到的字符
       for (int i = 0; i < cols; ++i){
           // 用于遍历辅助矩阵的每一列
           int r = 0;//用于表示当前路径的行号,初始值为0
           int c = i;//用于表示当前路径的列号
           while (r < rows && c < cols){
               res.push_back(encodedText[r*cols+c]);//在循环内部,这一行将矩阵中当前位置 (r, c) 对应的字符从 encodedText 中添加到结果字符串 res 中。
               ++r;//这一行增加行号 r,将路径向下移动一行。
               ++c;//这一行增加列号 c,将路径向右移动一列。
           }
       }
       // 删去末尾空格
       while (res.size() and res.back() == ' '){//它会不断检查 res 的最后一个字符是否是空格,并在是空格的情况下将其删除,直到字符串末尾没有空格字符为止。res.size() 返回字符串 res 的长度,即它包含的字符数。res.back() 返回字符串 res 的最后一个字符。
           res.pop_back();//这一行删除结果字符串 res 的最后一个字符。
       }
       return res;
   }
};

记录想法:

encodedText是已知的,我们可以知道它的长度,用来存放encodedText的矩阵的行数是已知的,相当于已知矩阵面积和它的宽,我们可以算出它的长(即得到该矩阵的列数)。为了得到正确顺序的字符串,我们只需要依次遍历该矩阵中的每一个空格即可(每次将路径向下移动一行且向右移动一列,保证是按照斜线方向来进行遍历的)得到正确的字符串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值