将一个给定字符串 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);
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/zigzag-conversion
1.用二维数组去把字符串S按照“Z”字型排列后,再用一个新的字符串将二维数组中的内容串成一串儿。
2.如何把S按照“Z”字型排列?
2.1先确定二维矩阵的shape:
行数就是形参r;
列数:“Z”的排列有一定的周期性,周期为
一个周期占有的列数为1+r-2=r-1
所以,字符串的占有的列数为t*(r-1)
2.2 排列
设当前填写的位置为 (x,y),初始 (x,y)=(0,0)若当前字符下标 i,i 满足
,则向下移动,否则向右上移动。
- class Solution {
- public:
- string convert(string s, int numRows) {
- int n=s.length();
- if(numRows==1 || n<numRows){
- return s;
- }
- int t=2*numRows-2;
- int c=(n/t+1)*(numRows-1);
- vector<string> chars(numRows, string(c, 0));
- int x=0,y=0;
-
-
- for(int i=0;i<n;i++){
- if(i%t<numRows-1){
- chars[x++][y]=s[i];
- }else{
- chars[x--][y++]=s[i];
- }
- }
- string ans; //c++有自己的字符串
- for(auto &row:chars){//类似java的for循环
- for(char ch:row){
- if(ch){
- ans+=ch;
- }
- }
- }
- return ans;
- }
- };