字符串 "PAYPALISHIRING"
写成指定行数的 zigzag 模式以下,它很像一个字符串在走 Z 字形:python
P A H N
A P L S I I G
Y I R
复制代码
将其每行字符串再连起来:"PAHNAPLSIIGYIR"
bash
实现函数,输入一个字符串和一个行号,返回上述转换后的字符串app
string convert(string s, int numRows);
复制代码
例 1:函数
输入: s = "PAYPALISHIRING", numRows = 3
输出: "PAHNAPLSIIGYIR"
复制代码
例 2:spa
输入: s = "PAYPALISHIRING", numRows = 4
输出: "PINALSIGYAHRPI"
解释:
P I N
A L S I G
Y A H R
P I
复制代码
Medium
code
这道题虽然是中等难度,但实际上解起来很简单,按题目要求,须要把原字符串按必定规则拆成 n 个子字符串,再将这 n 个子字符串首尾相连便可。leetcode
接下来就是如何拆原字符串的问题了,直接看上面的例子也许更容易些字符串
原字符串: PAYPALISHIRING
行数: 4
拆分结果:
[0]: P I N
[1]: A L S I G
[2]: Y A H R
[3]: P I
复制代码
上面的 4 个子字符串分别用序号 0-4 表示,接下来咱们再把该序号标记到到原字符串中,每一个字符对应一个序号get
PAYPALISHIRING
01232101232101
复制代码
发现规律了吧,因而咱们能够写一个程序,为原字符串中的每一个字符标记其所属的子字符串的序号,而后再根据该序号来构建 n 个子字符串,最后将它们按照升序的顺序首位相连。string
这样作的时间复杂度和空间复杂度都是 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)
复制代码