1.题目
将一个给定字符串 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
2.解题思路
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 满足,则向下移动,否则向右上移动。
3.代码
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;
}
};