1. Z字形变换问题解析
今天我们来深入探讨一个经典的字符串处理问题——Z字形变换。这个问题看似简单,但其中蕴含着许多值得思考的细节和优化空间。作为算法工程师,我们不仅要能解决问题,更要理解问题背后的本质。
Z字形变换的核心要求是将一个给定字符串按照指定的行数,以从上往下、从左到右的Z字形排列后,再按行读取生成新的字符串。比如"PAYPALISHIRING"在3行时的排列如下:
code复制P A H N
A P L S I I G
Y I R
最终输出应为"PAHNAPLSIIGYIR"。这个变换在数据压缩、图像处理等领域都有实际应用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题分析与解法思路
2.1 直观理解Z字形排列
首先我们需要明确什么是Z字形排列。当行数为numRows时:
- 字符先从上到下填充numRows个字符
- 然后从下到上填充numRows-2个字符(形成一个斜线)
- 重复这个过程直到字符串结束
以4行为例:
code复制P I N
A L S I G
Y A H R
P I
2.2 标号法原理
标号法是一种直观的解决方案,其核心思想是:
- 为字符串中的每个字符分配一个行号
- 行号从1到numRows递增,然后再递减回1,如此循环
- 最后将所有相同行号的字符按顺序拼接
这种方法的时间复杂度是O(n),空间复杂度也是O(n),其中n是字符串长度。
3. 代码实现与优化
3.1 基础实现
让我们先看一个基础的C++实现:
cpp复制class Solution {
public:
string convert(string s, int numRows) {
if(numRows == 1 || numRows >= s.length()) return s;
vector<int> rowNumbers;
int currentRow = 1;
int step = 1;
for(char c : s) {
rowNumbers.push_back(currentRow);
