6. Z字形变换(LeetCode 题解)

云平台

  题目描述:

  将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:

  之后从左往右,逐行读取字符:"PAHNAPLSIIGYIR"

  实现一个将字符串进行指定行数变换的函数:

  方法一、按行排序:

  思路

  通过从左向右迭代字符串,我们可以轻松地确定字符位于 Z 字形图案中的哪一行。

  算法

  我们可以使用 min(numRows, len(s)) 个列表来表示 Z 字形图案中的非空行。

  从左到右迭代 s,将每个字符添加到合适的行。可以使用当前行和当前方向这两个变量对合适的行进行跟踪。

  只有当我们向上移动到最上面的行或向下移动到最下面的行时,当前方向才会发生改变。

  C++ 代码实现

  Java 代码实现

  复杂度分析

  时间复杂度:O(n),其中 n == len(s)空间复杂度:O(n)方法二、按行访问:

  思路

  按照与逐行读取 Z 字形图案相同的顺序访问字符串。

  算法

  首先访问 行 0 中的所有字符,接着访问 行 1,然后 行 2,依此类推...

  对于所有整数 k,

  行 0 中的字符位于索引 k (2⋅numRows − 2) 处; 行 numRows − 1 中的字符位于索引 k (2 ⋅ numRows − 2) + numRows − 1 处; 内部的 行 i 中的字符位于索引 k (2 ⋅ numRows − 2) + I 以及 (k + 1)(2 ⋅ numRows − 2) − i 处;C++ 代码实现

  Java 代码实现

  复杂度分析

  时间复杂度:O(n),其中 n == len(s)。每个索引被访问一次。空间复杂度:O(n)。对于 C++ 实现,如果返回字符串不被视为额外空间,则复杂度为 O(1)。

标签: 云平台