将字符串 "PAYPALISHIRING"
以Z字形排列成给定的行数:
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
思路
按照与逐行读取 Z 字形图案相同的顺序访问字符串。
算法
首先访问 行 0
中的所有字符,接着访问 行 1
,然后 行 2
,依此类推...
对于所有整数 k,
- 行 0 中的字符位于索引k(2⋅numRows−2) 处;
- 行numRows−1 中的字符位于索引 k(2⋅numRows−2)+numRows−1 处;
- 内部的 行 i 中的字符位于索引 k(2⋅numRows−2)+i 以及 (k+1)(2⋅numRows−2)−i 处;
class Solution {
public:
string convert(string s, int numRows)
{
if(numRows==1)
return s;
int step=2*(numRows-1);
int n=s.size();
string ret="";
for(int i=0;i<n;i=i+step)
{
ret=ret+s[i];
}
for(int i=1;i<numRows-1;i++)
{
for(int j=i;j<n;j=j+step)
{
ret=ret+s[j];
if(j+step-2*i<n)
ret=ret+s[j+step-2*i];
}
}
for(int i=numRows-1;i<n;i=i+step)
{
ret=ret+s[i];
}
return ret;
}
};