タイトル
文字列「PAYPALISHIRING」は、次のように指定された数の行にジグザグパターンで書き込まれます(読みやすいように、このパターンを固定フォントで表示することもできます)。
L C I R
E T O E S I I G
E D H N
そして、行ごとに読みます: "PAHNAPLSIIGYIR"
文字列を取得するコードを記述し、いくつかの行を指定してこの変換を行います。
指定された文字列を、指定された行数に従って、上から下、左から右へジグザグパターンに配置します。
たとえば、入力文字列が "LEETCODEISHIRING"で、行数が3の場合、配置は次のようになります。
L C I R
E T O E S I I G
E D H N
例
输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:
L D R
E O E I I
E C I H N
T S G
ソース:LeetCode
リンク:https ://leetcode.com/problems/zigzag-conversion
解決策
方法1:行番号を文字ごとに決定する
問題解決のアイデア
行の数がnumRowsで、文字が最初の行から下になり、後続の文字列が下に移動することを確認します。下にできない場合は上に移動します。nunrows文字列を使用して各行の文字を格納し、最後にそれらを接続します。
コード
class Solution {
public:
string convert(string s, int numRows) {
if(numRows < 2) return s;
string result[numRows];
for(int i = 0; i < numRows; ++i) result[i] = "";
int curr = 0, dir = 1;
for(int i = 0; i < s.length(); ++i){
result[curr] += s[i];
if(curr == numRows-1) dir = -1;
else if(curr == 0) dir = 1;
curr += dir;
}
string res = "";
for(int i = 0; i < numRows; ++i){
res += result[i];
}
return res;
}
};
方法2:行ごとに文字を決定する
問題解決のアイデア
numRows = 0およびnumRows = 1を除くnumRows行データの場合、groupnum = 2 numRows-2の数値は、合計nグループのグループに分割できます。このとき、行番号iには、行0とnumRows-1を除いて、index = i + t goupnum(0 <= t <= n、0 <= index <s.length())の文字が必要です。行、各グループの行には2つの文字があります。つまり、i +(t + 1)goupnum-2 i =(t + 1)* groupnum-iもこの行にあるため、各グループを順番に出力するだけですラインに落ちるキャラクターだけ
コード
class Solution {
public:
string convert(string s, int numRows) {
string result = "";
if(numRows < 2) return s;
int group_num = numRows+numRows-2, line = 0;
for(int i = 0; i < numRows; ++i){
int pos = i;
while(pos < s.length()){
result = result+s.substr(pos, 1);
pos += group_num;
if(i != 0 && i != numRows-1 && pos-i*2 < s.length()){
result = result+s.substr(pos-i*2, 1);
}
}
}
return result;
}
};
まとめ
- 方法2には多くの計算が含まれるため、コストは方法よりも大きくなります。