0%

[Leetcode]6. ZigZag Conversion

题目描述

The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

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

And then read line by line: “PAHNAPLSIIGYIR”

Write the code that will take a string and make this conversion given a number of rows:

string convert(string s, int numRows);

例子

例子 1

Input: s = “PAYPALISHIRING”, numRows = 3
Output: “PAHNAPLSIIGYIR”

例子 2

Input: s = “PAYPALISHIRING”, numRows = 4
Output: “PINALSIGYAHRPI”
Explanation:

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

解题思路

这道题虽然是 Medium 难度,但是感觉整体来说想出一个方法并不是特别难;我的思路是用一个向量存各行的子串,然后遍历一遍字符串对每个字符根据他的位置找出对应的行数就可以了,求行数的话通过观察例子也可以发现一定规律:对于 N 行,每经过 2(N-1) 个位置就会出现一个循环;所以我们可以把索引 i2(N-1) 取余;再和 N-1 比较找到正确的行数即可,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public:
string convert(string s, int numRows) {
if (numRows <= 1 || s.length() <= numRows) return s;

vector<string> rows(numRows, "");

for (int i = 0; i < s.length(); i++) {
/**
* x x x
* x xx x
* xx xx
* x x
*
* say we have n row, then 2(n - 1) forms a cycle of positions
*/

int row = i % (2 * numRows - 2);
if (row >= numRows) {
row = 2 * numRows - 2 - row;
}
rows[row] += s[i];
}

string result = "";
for (int i = 0; i < numRows; i++) {
result += rows[i];
}

return result;
}
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)