Z字変換
問題の説明:
与えられた文字列を、与えられた行数に従って、上から下、左から右へジグザグパターンに配置します。
たとえば、入力文字列が "LEETCODEISHIRING"で、行数が3の場合、配置は次のようになります。
L C I R
ETOE S I I G
E D H N
その後、出力を1行ずつ左から右に読み取って、「LCIRETOESIIGEDHN」などの新しい文字列を生成する必要があります。
文字列を指定した行数に変換する次の関数を実装してください:
string convert(string s、int numRows);
例1:
入力:s = "LEETCODEISHIRING"、numRows = 3
出力: "LCIRETOESIIGEDHN"
例2:
入力:s = "LEETCODEISHIRING"、numRows = 4
出力: "LDREOEIIECIHNTSG"
説明:
L D R
E OE I I
EC I H N
T S G
問題解決のアイデア:
この質問はルールの検索に関するものであり、多くの解決策はその期間2n-2を見つけることです。私は比較的シンプルで失礼です。各列の文字を対応するコンテナーに直接格納します。最長の列はnumRowsで、中央に1つ必要です基本的にnumRows-2に固定されている、後ろから前に格納することで十分です。
コードは次のとおりです。
#include<iostream>
#include<vector>
using namespace std;
string convert(string s, int numRows) {
string a[numRows];
if(s.size()==numRows){//字符串的大小等于numRows直接返回s
return s;
}
for(int i=0;i<s.size();i++){
for(int j=0;j<numRows&&i<s.size();j++,i++){//读取完整的一列,i记得要判断会不会出界
a[j]+=s[i];
}
for(int j=numRows-2;j>=1&&i<s.size();j--,i++){//从后往前读取单独一个的一列
a[j]+=s[i];
}
i--;//一次循环结束了会i++,上面结束循环已经+1了,所以要-1
}
string tmp="";
for(int i=0;i<numRows;i++){//把保存的字符串都放到tmp中
tmp+=a[i];
}
return tmp;
}
int main(){
string a="LEETCODEISHIRING";
cout<<convert(a,4);
return 0;
}