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 RAnd 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 text, int nRows);
convert("PAYPALISHIRING", 3)
should return
"PAHNAPLSIIGYIR"
.
解决此题的方法是将例子中的不同行数的结果画在纸上,你就会发现规律:原来只是依次往各行的末尾添加字符即可,最后顺序输出。
class Solution {
public:
string convert(string s, int nRows) {
if (nRows < 1)
return "";
vector<vector<char>> zz(nRows);
int j = 0, d = 1;
for (int i = 0; i < s.length(); i++)
{
zz[j].push_back(s[i]);
j += d;
if (j >= nRows)
{
d = -1;
j = max(nRows - 2, 0);
}
else if (j < 0)
{
d = 1;
j = min(1, nRows - 1);
}
}
string ret;
for (int i = 0; i < nRows; i++)
{
for (auto ch : zz[i])
ret += ch;
}
return ret;
}
};