6 ZigZag Conversion

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 convert(string s, int numRows) {
    if (s.empty())
        return s;

    vector<vector<char>> zigs(numRows);
    int row = 0, col = 0;

    // 0 1 2 1 0 1 2 0 1 2 0 1 2…
    /*
    P   A   H   N
    A P L S I I G
    Y   I   R
    */
    int cur_index = 0;
    int reset = 1;
    while (cur_index < s.length()) {

        for (row; row < numRows && cur_index < s.length(); row++) {
            zigs.at(row).push_back(s.at(cur_index++));
        }

        for (row = row - 2; row >= 0 && cur_index < s.length(); row--) {
            zigs.at(row).push_back(s.at(cur_index++));
        }
        row = reset;
    }

    //print2d(zigs);

    string ret_str;
    int iter = 0;
    int where = 0;
    for (int i = 0; i < zigs.size(); i++) {
        for (int j = 0; j < zigs.at(i).size(); j++) {
            ret_str.insert(where++, string(1, zigs.at(i).at(j)));
        }
        iter++;
    }

    return ret_str;
}



int main() {
    string conv = "PAYPALISHIRING";
    cout << convert(conv, 3) << endl;
    pause();



}

Last updated