为了账号安全,请及时绑定邮箱和手机立即绑定

[LeetCode 程序员修炼内功系列] 6. ZigZag Conversion 题解

问题描述

字符串 "PAYPALISHIRING" 写成指定行数的 zigzag 模式如下,它很像一个字符串在走 Z 字形:

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

问题难度

Medium

解题思路

这道题虽然是中等难度,但实际上解起来很简单,按题目要求,需要把原字符串按一定规则拆成 n 个子字符串,再将这 n 个子字符串首尾相连即可。

接下来就是如何拆原字符串的问题了,直接看上面的例子也许更容易些

原字符串: PAYPALISHIRING
行数: 4
拆分结果: 
[0]: P     I    N
[1]: A   L S  I G
[2]: Y A   H R
[3]: P     I

上面的 4 个子字符串分别用序号 0-4 表示,接下来我们再把该序号标记到到原字符串中,每个字符对应一个序号

PAYPALISHIRING
01232101232101

发现规律了吧,于是我们可以写一个程序,为原字符串中的每个字符标记其所属的子字符串的序号,然后再根据该序号来构建 n 个子字符串,最后将它们按照升序的顺序首位相连。

这样做的时间复杂度和空间复杂度都是 O(n),代码如下:

def convert(self, s, numRows):
    """
    :type s: str
    :type numRows: int
    :rtype: str
    """
    index = 0
    sign = 1
    zigzag_array = []
    for c in s:
        if index == 0:
            sign = 1
        elif index == numRows - 1:
            sign = -1
        if len(zigzag_array) < index + 1:
            zigzag_array.append("")

        zigzag_array[index] += c
        index += sign
    return "".join(zigzag_array)
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消