leetcodeノート: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" .
二.テーマ分析
この問題は元の文字列の要素と鋸歯化された文字列の要素との関係であり、例を挙げて説明することができ、元の文字列の各文字の下に0,1,2,3,...,12がそれぞれ行数3,4,5行の鋸歯化を行うと仮定する.
定義元の文字列をnRows行で鋸歯化し、定義Step=2*nRows-2;上記の例から分かるように、i行目については、次の2つのケースがある.
1.0行目と(nRows-1)行目について、各行の要素はi,i+Step,i+2*Step,...;2.他の行の場合、各行の要素はi、Step-i、i+Step、2*Step-i、....
三.インスタンスコード
class Solution
{
public:
    string convert(string s, int nRows) {
        if (nRows <= 1) return s;
        string result = "";
        int step = 2 * nRows - 2;
        for (int i = 0; i < nRows; ++i)
        {
            for (int j = i; j < s.size(); j += step)
            {
                result = result + s[j];
                int midIndex = (j - i) + step - i;
                if (i != 0 && i != nRows - 1 && midIndex < s.size())
                    result = result + s[midIndex];
            }
        }
        return result;
    }
};

四.小結
この問題は主に文字列だった要素座標と鋸歯化された文字列の座標関係を探すことだ.