- ZigZag Conversion
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)
Example:
==Solution 1 ==
Time Complexity: O(n)
Space Complexity:O(numRows^2)
class Solution {
public String convert(String s, int numRows) {
if(s == null || s.length() <=2 || numRows >= s.length() || numRows == 1)
return s;
int len = s.length();
char[][] chars = new char[len][len];
int numCols = 0;
int count = 0;
while(count < len) {
int tempColIndex = numCols % (numRows-1);
if(tempColIndex == 0) {
for(int i = 0; i < numRows && count < len; i++) {
chars[i][numCols] = s.charAt(count);
count++;
}
} else {
chars[numRows-1-tempColIndex][numCols] = s.charAt(count);
count++;
}
numCols++;
}
String newS = "";
for(int i = 0; i < numRows; i++){
for(int j = 0; j <= numCols; j++) {
if(chars[i][j] != '\u0000' )
newS += chars[i][j];
}
}
return newS;
}
}
Solution 2
==Time Complexity: O(n) ==
Space Complexity: O(n)
ignored case
class Solution {
public String convert(String s, int numRows) {
if(numRows == 1)
return s;
int len = s.length();
List<StringBuilder> rows = new ArrayList<>();
for(int i = 0; i < numRows; i++)
rows.add(new StringBuilder());
int curRow = 0;
boolean goDown = false;
for(char c : s.toCharArray()) {
rows.get(curRow).append(c);
if(curRow == 0 || curRow == numRows-1)
goDown = !goDown;
curRow += goDown?1:-1;
}
StringBuilder newS = new StringBuilder();
for(StringBuilder row : rows) {
newS.append(row);
}
return newS.toString();
}
}
Solution 3
Time Complexity: O(n), Space Complexity: O(n)
Consideration
- Characters in row 0 are located at indexes k * (2 *numRows - 2)
- Characters in row numRows-1 are located at indexes k* (2 *numRows - 2)+numRows-1
- Character in row i (0 < i < numRows-1) are located at indexes k* (2 numRows - 2)+i and (k+1) (2 *numRows - 2)-i
- To sum up, characters in row i are located at k * (2 numRows - 2)+i, if 0 < i < numRows-1, one more character are located at (k+1) (2 *numRows - 2)-i.
class Solution {
public String convert(String s, int numRows) {
if(numRows == 1)
return s;
int len = s.length();
int cycleLen = 2*numRows-2;
StringBuilder newS = new StringBuilder();
for(int i = 0; i < numRows; i++) {
for(int j = 0; j+i < len; j+=cycleLen) {
newS.append(s.charAt(j+i));
if(i != 0 && i != numRows-1 && j + cycleLen -i < len)
newS.append(s.charAt(j+cycleLen-i));
}
}
return newS.toString();
}
}