[Leetcode 42] 6 ZigZag Conversion

Problem:

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".

 

Analysis:

First of all, you should know what's the meaning of zigzag. To understand more, try some more examples.

If n = 2, then "PAYPALISHIRING" is arranged into:

P Y A I H R N

A P L S I I G

and converted into "PYAIHRNAPLSIIG"

 

If n = 4, then "PAYPALISHIRING" is arranged into:

P         I         N

A     L  S     I  G

Y  A     H  R

P        I 

 

If n = 5, then  "PAYPALISHIRING" is arranged into:

P            H

A        S  I         G

Y      I     R    N

P  L         I

A

 

Now try to find the relationship of characters in the same row. We may find that, for elements in 

n = 2, two characters in the same row's index differs 2

n = 3, first line's characters' index differs 4; second line's characters' index differs 2 2; third line's characters' index differs 4;

n = 4, first line's characters' index differs 6; second line's characters' index differs 4 2; third line's characters' index differs 2 4; fourth line difffers 6;

n=5, first line differ 8; second line differ 6 2; third line differ 4 4; fourth line differ 2 6; fifth line differ 0 8;

 

It's clear that there is a relationship. If think carefully, you may find the relationship is as follows:

fp = 2*(n-1), sp=2*i; Then the next element is draw from current index plus fp/sp staggered.

So the solution is as follows.

 

Code:

 1 class Solution {
 2 public:
 3     string convert(string s, int nRows) {
 4         // Start typing your C/C++ solution below
 5         // DO NOT write int main() function    
 6         if (nRows == 1) return s;
 7         
 8         char res[s.length()];
 9         int idx = 0;
10         
11         for (int i=0; i<nRows; i++) {
12             int fp = 2*(nRows - i - 1);
13             int sp = 2*i;
14             
15             bool flag = true;
16             for (int j=i; j<s.length(); ) {
17                 if (flag) {
18                     if (fp != 0) 
19                         res[idx++] = s[j];
20                     j += fp;
21                 }
22                 else {
23                     if (sp != 0)
24                         res[idx++] = s[j];
25                         
26                     j += sp;
27                 }
28                 
29                 flag = !flag;
30             }
31         }
32         res[idx] = '\0';
33         
34         string r(res);
35         return r;
36     }
37 };
View Code

 

posted on 2013-05-24 12:29  freeneng  阅读(145)  评论(0编辑  收藏  举报

导航