题干
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/zigzag-conversion/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
1 2 3
| P A H N A P L S I I G Y I R
|
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:”PAHNAPLSIIGYIR”。
请你实现这个将字符串进行指定行数变换的函数:
1
| string convert(string s, int numRows);
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 示例 1:
输入:s = "PAYPALISHIRING", numRows = 3 输出:"PAHNAPLSIIGYIR"
示例 2:
输入:s = "PAYPALISHIRING", numRows = 4 输出:"PINALSIGYAHRPI" 解释: P I N A L S I G Y A H R P I
示例 3:
输入:s = "A", numRows = 1 输出:"A"
|
1 2 3 4 5
| 提示:
1 <= s.length <= 1000 s 由英文字母(小写和大写)、',' 和 '.' 组成 1 <= numRows <= 1000
|
思路
纯模拟,分别移动矩阵内的指针,然后打印;注意特殊情况,numRows 为 1 的时候,直接返回。
官方思路学习: https://leetcode.cn/problems/longest-palindromic-substring/solutions/255195/zui-chang-hui-wen-zi-chuan-by-leetcode-solution/
AC 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| class Solution { public: string convert(string s, int numRows) { int n = s.length();
if(numRows < 2){ return s; } vector<string> ans(numRows, string(n,0)); int x = 0, y = 0;
int pos = 0; bool flag = false;
while(pos < n){ ans[x][y] = s[pos]; pos ++; if(x == numRows - 1 || x == 0){ flag = !flag; }
if(flag){ x ++; }else{ y ++; x --; } }
string t = ""; for(int i = 0; i < numRows; i ++){ for(int j = 0; j < n; j ++){ if(ans[i][j]) t = t + ans[i][j]; } }
return t; } };
|