问题描述:The string "PAYPALISHIRING"
is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
解题思路:用状态机模拟放置字符串,最后再将字符串矩阵输出即可。
代码如下:
using namespace std;
class Solution {
public:
//down = 0 rightTop = 1
void stateM(int& curState, int& xOp, int& yOp, int curR, int numR){
switch (curState)
{
case 0:{
xOp = 0;
yOp = 1;
if (curR + yOp == numR)
curState = 1;
break;
}
case 1:{
xOp = 1;
yOp = -1;
if (curR + yOp == 1)
curState = 0;
break;
}
default:
break;
}
}
string convert(string s, int numRows) {
if (s == "") return s;
if (numRows <= 1) return s;
int *m = new int[s.size() * s.size()];
for (int i = 0; i < s.size() * s.size(); ++i){
m[i] = -1;
}
int curState = 0;
int curR = 1;
int xOp, yOp, curX = 1, curY = 1;
for (int i = 0; i < s.length(); ++i){
m[(curY - 1) * s.size() + (curX - 1)] = s[i];
stateM(curState, xOp, yOp, curR, numRows);
curX += xOp;
curY += yOp;
curR = curY;
}
int index = 0;
for (int i = 0; i < s.size(); ++i){
for (int j = 0; j < s.size(); ++j){
if (m[i * s.size() + j] != -1){
s[index++] = m[i * s.size() + j];
}
}
}
delete[] m;
return s;
}
};
运行结果如下: