package com.interview.leetcode.strings;
/**
* Created_By: stefanie
* Date: 14-11-17
* Time: 下午7:02
*/
public class StringOperation {
/**
* since s contains more ' ', can't do it in place, so using StringBuilder will simplify the solution
*/
public static String reverseWords(String s) {
StringBuilder reversed = new StringBuilder();
int end = s.length();
for(int i = s.length() - 1; i >= 0; i--){
if(s.charAt(i) == ' ') end = i;
else if(i == 0 || s.charAt(i - 1) == ' '){
if(reversed.length() > 0) reversed.append(' ');
reversed.append(s.substring(i, end));
}
}
return reversed.toString();
}
/**
* in place reverse: first reverse the sens, then reverse every word
*/
public static void reverseWords(char[] s) {
reverse(s, 0, s.length - 1);
for(int i = 0, j = 0; j <= s.length; j++){
if(j == s.length || s[j] == ' ') {
reverse(s, i, j - 1);
i = j + 1; //don't swap ' '
}
}
}
public static void reverse(char[] str, int begin, int end){
for(int i = 0; i < (end - begin + 1) / 2; i++){
char temp = str[begin + i];
str[begin + i] = str[end - i];
str[end - i] = temp;
}
}
/**
* ZigZag sequence
*/
public String zigzagConvert(String s, int nRows) {
if(nRows == 1) return s;
StringBuilder[] builders = new StringBuilder[nRows];
for(int i = 0; i < nRows; i++) builders[i] = new StringBuilder();
int row = -1;
boolean down = true;
for(int i = 0; i < s.length(); i++){
if(down) builders[++row].append(s.charAt(i));
else builders[--row].append(s.charAt(i));
if(row == nRows - 1) down = false;
else if(row == 0) down = true;
}
for(int i = 1; i < nRows; i++){
builders[0].append(builders[i].toString());
}
return builders[0].toString();
}
}