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 text, int nRows);
convert("PAYPALISHIRING", 3)
should return "PAHNAPLSIIGYIR"
.
思路:
把字符串先用二维矩阵存下来,然后先行后列存储到新string即可。注意Z形稀疏矩阵可以压缩存储,使空间复制度还是O(n)。AC代码如下:
1 class Solution { 2 public: 3 string convert(string s, int numRows) { 4 if(s==""|| numRows==1){ 5 return s; 6 } 7 int residual,i_col,n=s.size(); 8 int circle=2*numRows-2,count=0; 9 int col=(n-1)/(numRows-1)+1; 10 char tmp[numRows][col]; 11 string res; 12 memset(tmp, 0, sizeof(tmp)); 13 for(int i=0;i<n;i++){ 14 residual=i%circle; 15 i_col=2*(i/circle)+(i%circle)/numRows; 16 if(residual<numRows) 17 tmp[residual][i_col]=s[i]; 18 else 19 tmp[numRows-residual%numRows-2][i_col]=s[i]; 20 } 21 for(int i=0;i<numRows;i++) 22 for(int j=0;j<col;j++) 23 if(tmp[i][j]!='\0') 24 res+=tmp[i][j]; 25 return res; 26 } 27 };