题目描述:
将字符串 "PAYPALISHIRING"
以N形排列成给定的行数:
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
思路:
观察示例可知,往下走要走numRows步,往上走要走numRows-2步(除去头尾,因为和往下走重叠)
模拟N字遍历字符串
- 往下走numRows步
- 往上走numRows-2步
- 重复1,2直到字符串遍历结束
可以看出二维存放:
1 7
2 6 8 12
3 5 9 11
4 10
C++代码:
class Solution {
public:
string convert(string s, int numRows) {
if (s.size() <= 1) return s;
std::vector<string> ret(numRows); //ret[0]存放第0行字符串,ret[1]存放第1行字符串. 一定要设置大小。
int i = 0;
std::string cur_str;
while (i < s.size()) // 按N字形遍历s
{
// 往下走numRows步
for (int row = 0; row < numRows && i < s.size(); row++, i++)
{
cur_str = s[i]; // char to string.
ret[row].append(cur_str); // vec[row]是string,支持拼接
}
//往上走numRows-2步
for (int row = numRows-2; row > 0 && i < s.size(); row--, i++)
{
cur_str = s[i]; // char to string.
ret[row].append(cur_str);
}
}
// 按行拼接ret字符串
std::string output;
for (int i = 0; i < ret.size(); i++) output.append(ret[i]);
return output;
}
};
说明:vec[0]: 保存是string字符串,即第0行分别是图例中的1,7;vec[1]保存的是第1行,即1,6,8,12;
python代码:
执行用时:44 ms, 在所有 Python 提交中击败了73.07%的用户
内存消耗:13.3 MB, 在所有 Python 提交中击败了33.56%的用户
class Solution(object):
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
# 二维矩阵,先行后列存储
s_len = len(s)
if s_len < 2: return s
vec = [""]*numRows # 定义numRows个字符串,vec[0]是z字型的第0行字符串string
s_idx = 0
while s_idx < s_len: # 遍历字符串
row = 0
while s_idx < s_len and row < numRows: # 往下走
vec[row] = vec[row] + s[s_idx]
row = row + 1
s_idx = s_idx + 1
row = numRows - 2
while s_idx < s_len and row > 0:
vec[row] = vec[row] + s[s_idx]
row = row - 1
s_idx = s_idx + 1
for i in range(1, numRows):
vec[0] = vec[0] + vec[i]
return vec[0]