这几天因为状态不太好,在这题上花了比较多的时间,记录一下。
因为题目很老了,Leetcode上关于此题的题解很多,然而很多题解解释得都不是很清楚,包括leetcode官方题解,题解中符号所表示的意思都不写明,无力吐槽,还是自己写一个当笔记吧。
题目详情
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入: s = “LEETCODEISHIRING”, numRows = 3
输出: “LCIRETOESIIGEDHN”
示例 2:
输入: s = “LEETCODEISHIRING”, numRows = 4
输出: “LDREOEIIECIHNTSG”
解释:
解法一:找规律
此解法图较多,因此先讲该解法,看过解法一的图再讲解法二就更易于让人理解。
思路:
- 根据观察,找出 Z 字形矩阵中,每行所包含的字符在字符串s中的下标,找出下标之间的规律;
- 根据规律,遍历字符串 s,拼接出Z字形结果字符串。
先用几个例子将 s 的 Z 字形变换写出来,然后观察规律,下面给出两个例子:
例1:
例2:
通过观察,可以得出以下规律:
即:
令 n = n u m R o w s n = numRows n=numRows, row 表示 Z 字形结果矩阵的行号:
Z 字形结果矩阵中每一行所包含的字符的下标 i 间差值的规律为:
首尾两行: i n t e r v a l = 2 ∗ n − 2 interval = 2*n - 2 interval=2∗n−2;
中间行: i n t e r v a l = 2 ∗ n − 2 − 2 ∗ r o w interval = 2*n - 2 - 2*row interval=2∗n−2