Leetcode Z字形变换

题目描述:

将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:

P   A   H   N
A P L S I I G
Y   I   R

之后从左往右,逐行读取字符:"PAHNAPLSIIGYIR"

实现一个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例 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

思路:

参考 

观察示例可知,往下走要走numRows步,往上走要走numRows-2步(除去头尾,因为和往下走重叠)
模拟Z字遍历字符串

  1. 往下走numRows步
  2. 往上走numRows-2步
  3. 重复1,2直到字符串遍历结束

《Leetcode Z字形变换》

C++代码:

class Solution {
public:
	string convert(string s, int numRows) {
		if (numRows < 2) // 一行或者空行,返回本身
			return s;

		vector<string> vec(numRows);  // vec[0]:z字型的第0行字符串;vec[1]:第1行。型如2维数组

		int index = 0, len = s.size(); // index:s字符串索引
		string curr_char;
		while (index < len){  // 遍历字符串s
			for (int row = 0; row < numRows && index < len; row++) {// 往下走4步
				curr_char = s[index];  // index和row一起变化4次,向下4步
				vec[row].append(curr_char);
				index++;
			}
			for (int row = numRows - 2; row > 0 && index < len; row--){ // 往下走2步
				curr_char = s[index];
				vec[row].append(curr_char);
				index++;
			}
		}

		// 二维变一维,拼接在第0行后面, 以便返回输出
		for (int row = 1; row < numRows; row++) // 把其他行,拼接在0行的后面
			vec[0].append(vec[row]);

		return vec[0];
	}
};

 

说明:vec[0]: 保存是string字符串,即第0行分别是图例中的1,7;vec[1]保存的是第1行,即1,6,8,12;

    原文作者:Z字形编排问题
    原文地址: https://blog.csdn.net/jizhidexiaoming/article/details/84196447
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞