Leetcode 6. Z 字形变换(牛逼,解决了)

在这里插入图片描述
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

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

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

示例 3:

输入:s = "A", numRows = 1
输出:"A"

提示:

  • 1 <= s.length <= 1000
  • s 由英文字母(小写和大写)、',' 和 '.' 组成
  • 1 <= numRows <= 1000

Code:

class Solution {
public:
    string convert(string s, int numRows) {
        if(numRows==1)
            return s;
        string res;
        int col=0;
        int loop=0;
        int row=numRows;
        vector<vector<char>> newOne(numRows, vector<char>(10000, ' '));
        do
        {
            //if(col)
            if(row==numRows)
            {
                for(int i=0;i<row;i++)
                {
                    newOne[i][col]=s[loop++];
                    if(loop==s.length())
                    {
                        loop=0;
                        for(int m=0;m<newOne.size();m++)
                        {
                            vector<char>sub=newOne[m];
                            for(int n=0;n<sub.size();n++)
                            {
                                if(sub[n]!=' ')
                                {
                                    loop++;
                                    res+=sub[n];
                                }
                                //                    cout<<sub[n]<<" ";
                                if(loop==s.length())
                                    return res;
                            }
                            //            cout<<endl;
                        }
                        return res;
                    }
                }
            }
            else
            {
                newOne[row-1][col]=s[loop++];
                if(loop==s.length())
                {
                    
                    loop=0;
                    for(int m=0;m<newOne.size();m++)
                    {
                        vector<char>sub=newOne[m];
                        for(int n=0;n<sub.size();n++)
                        {
                            if(sub[n]!=' ')
                            {
                                loop++;
                                res+=sub[n];
                            }
                            //         cout<<sub[n]<<" ";
                            if(loop==s.length())
                                return res;
                        }
                        //         cout<<endl;
                    }
                    return res;
                }
            }
            col++;
            if(row>1)
                row--;
            else
                row++;
            if(row==1)
            {
                row=numRows;
            }
        }while(1);
        
        return res;
    }
};
posted @ 2022-06-28 15:47  萧海~  阅读(17)  评论(0编辑  收藏  举报