6. Z 字形变换

题目

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:

P   A   H   N
A P L S I I G
Y   I   R

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"

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

string convert(string s, int numRows);

示例 1:

输入: s = "PAYPALISHIRING", numRows = 3
输出: "PAHNAPLSIIGYIR"

示例 2:

输入: s = "PAYPALISHIRING", numRows = 4
输出: "PINALSIGYAHRPI"
解释:
P     I    N
A   L S  I G
Y A   H R
P     I

示例 3:

输入: s = "A", numRows = 1
输出: "A"

提示:

  • 1 <= s.length <= 1000
  • s 由英文字母(小写和大写)、',''.' 组成
  • 1 <= numRows <= 1000

解题思路

避免直接字符串拼接,使用一个字符串列表来代替。通过切换方向变量going_down和当前行索引cur_row来模拟Z字形排列。

代码

class Solution:
    def convert(self, s: str, numRows: int) -> str:
        if numRows == 1 or numRows >= len(s):
            return s

        rows = [''] * min(numRows, len(s))
        cur_row = 0
        going_down = False

        for c in s:
            rows[cur_row] += c
            if cur_row == 0 or cur_row == numRows - 1:
                going_down = not going_down
            cur_row += 1 if going_down else -1

        return ''.join(rows)

运行

sol = Solution() 
print(sol.convert("PAYPALISHIRING", 3)) # 应输出 "PAHNAPLSIIGYIR" print(sol.convert("PAYPALISHIRING", 4)) # 应输出 "PINALSIGYAHRPI"

总结

Z 字形变换算法通过模拟字符在矩阵中的垂直移动来实现。算法首先创建一个字符串列表,每个字符串代表矩阵的一行。遍历输入字符串中的每个字符,根据当前的行索引将其添加到对应的行字符串中。当字符移动到第一行或最后一行时,改变其垂直移动的方向。这种方法可以有效地按照 Z 字形模式来组织字符,然后通过顺序连接每一行得到最终的结果字符串。这种实现避免了对字符串进行多次不必要的重复拼接,从而提高了算法的执行效率。

题目链接

https://leetcode.cn/problems/zigzag-conversion/description/

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目:https://leetcode-cn.com/problems/zigzag-conversion/[ht...
    gykimo阅读 179评论 0 0
  • 6. Z 字形变换[https://leetcode-cn.com/problems/zigzag-convers...
    程序员小2阅读 177评论 0 1
  • 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 ...
    简_爱SimpleLove阅读 294评论 0 1
  • 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "LEETCODEIS...
    HollyLiu阅读 111评论 0 0
  • 题目描述: 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "LEETC...
    LeeYunFeng阅读 968评论 0 50