6. Z 字形变换/字符串处理

题目描述

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:

L   C   I   R
E T O E S I I G
E   D   H   N

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"

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

string convert(string s, int numRows);

示例 1:

输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"

示例 2:

输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:

L     D     R
E   O E   I I
E C   I H   N
T     S     G

分析

走"z"字形(或者应该叫“N”字形),其实就是上下走而已。首先确定N字形的行数row,然后创建row个字符串,用于存储每一行。通过判断下一步是往下走还是往上走判断下一步该放在哪一行。

AC代码

class Solution {
public:
    string convert(string s, int numRows) {
        if(numRows==1) return s;
        int row=min(numRows,(int)s.size());
        vector<string> rows(row);
        bool godown=false;int cur=0; //初始应该设godown为false,因为cur=0会改变godown的值
        for(char c:s){
            rows[cur]+=c;
            if(cur==numRows-1||cur==0) godown=!godown;
            cur+=godown?1:-1;
        }
        string ans;
        for(auto temp:rows) ans+=temp;
        return ans;
    }    
};
发布了62 篇原创文章 · 获赞 7 · 访问量 3114

猜你喜欢

转载自blog.csdn.net/weixin_43590232/article/details/104186470