LeetCode-06-ZigZagConversion

本文最后更新于:a year ago

题目

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)

1
2
3
P   A   H   N
A P L S I I G
Y I R

And then read line by line: “PAHNAPLSIIGYIR”


Example1
1
2
Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"

Example2

1
2
3
4
5
6
7
Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:
P I N
A L S I G
Y A H R
P I

Example3

1
2
Input: s = "A", numRows = 1
Output: "A"

题目大意

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

1
2
3
P   A   H   N
A P L S I I G
Y I R

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

解题思路

这题可以先将不同的行的字母存储在一组中,再将不同组整合到一个字符串中。难度不大,但不一定能想到。

算法流程:按顺序白能力字符串s;
    1. res[i] += c : 把每个字符 c 填入对应行si;
    2. i += flag : 更新当前字符 c 对应的行索引;
    3. flag = -flag

代码

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
package leetcode;

import java.util.ArrayList;
import java.util.List;

public class D06_ZipZagConversion {

public String convert(String s, int numRows) {
if (numRows < 2) return s;
List<StringBuilder> rows = new ArrayList<StringBuilder>();
for (int i = 0; i < numRows; i++) {
rows.add(new StringBuilder());
}
int i = 0, flag = -1;
for (char c : s.toCharArray()) {
rows.get(i).append(c);
if (i==0 || i==numRows - 1) flag = -flag;
i += flag;
}
StringBuilder res = new StringBuilder();
for (StringBuilder row : rows) {
res.append(row);
}
return res.toString();
}

}

复杂度分析

* 时间复杂度:O(N),遍历一遍字符串 s ;
* 空间复杂度:O(N),各行字符串共占用O(N)额外空间。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!