Z 字形变换
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
示例
输入:s = "PAYPALISHIRING", numRows = 3
输出:"PAHNAPLSIIGYIR"
思路
对于这种题目,可以直接用模拟的方式进行解题。
除此之外,还可以再研究一下是否存在一些规律来降低模拟的复杂度。仔细研究题目之后可以发现,对于给定的字符串s,遍历时需要从上到下再到上再到下不断循环来排列字符串s,因此可以把行索引从0到rownum-1(从上到下)再上升到0(从下到上)这样子作为一个循环单位(如下图)。
确定了循环单位之后,接下来就是简单的模拟重复输出循环单位就可以啦。
因为这道题目在输出字符串的时候无需考虑字母间的空格数量,相对而言会少一步推理,感觉难度上会降低一点点
代码
string convert(string s, int numRows) {
int len = s.size();
//用来存储每一行的字符串
vector<string> ans(numRows);
//确定循环单位的行索引
vector<int> indices;
for(int i =0;i<numRows;i++){
indices.push_back(i);
}
for(int i =numRows-2;i>0;i--){
indices.push_back(i);
}
int indicelen = indices.size();
//开始打印字符串
int i = 0;
while(i<len){
ans[indices[i%indicelen]]+=s[i];
i++;
}
string final = "";
for(int i = 0;i<numRows;i++){
final+=ans[i];
}
return final;
}