Question 5 Reverse Words in a String
注意如何找word开头和结尾
word 开头的定义:这一个不是space +( 这是第一个 or 前一个字母是space)
word结尾的定义:这一个不是space + (这是最后一个 or后一个是space)
注意找可以留下来的
word不是space
word是第一个space:自己是space + (前一个不是space + 不是第一个)
注意trim的结尾
// Some code
```java
/*
clarification & assumption:
- string with repeated characters and space
high level:
- reverse all and reverse each word and trim
middle level:
- reverse whole string reverse(word, i, j)
- reverse each word from the begin char with two pointers
// find slow and fast pointer until slow reach the length
// slow pointer: the first char (the previous is ' ' or the first char) and the current is not ' ')
// fast pointer: the last char (the current is not ' ', the last one or the next is ' ')
- trim the space
// two pointer fast and slow
// fast pointer: to explore the space
- if fast pointer is not " ", keep it, keep it,
- if fast pointer is " " but it is the first space(first one, or previous is != ' '), keep it,
// slow pointer: from 0 to current slow index - 1, all char will be remained
// postprocessing: if char[slow] is " ", slow--;
tc & sc: O(n), O(n)
*/
class Solution {
public String reverseWords(String s) {
if (s == null || s.length() == 0) {
return s;
}
// reverse whole string
char[] originalString = s.toCharArray();
reverString(originalString, 0, originalString.length - 1);
// reverse each word
reverWord(originalString);
// reverse each word with two pointer and skip the extra space
String returnValue = trim(originalString);
return returnValue;
}
private String trim (char[] originalString) {
int slow = 0;
int fast = 0;
while (fast < originalString.length) {
if (originalString[fast] == ' ' && (fast != 0 && originalString[fast - 1] != ' ')) {
originalString[slow] = originalString[fast];
slow++;
}
else if (originalString[fast] != ' '){
originalString[slow] = originalString[fast];
slow++;
}
fast++;
}
// corner case
if (slow > 0 && originalString[slow - 1] == ' ') {
slow--;
}
return new String(originalString, 0, slow);
}
private void reverWord(char[] originalString) {
int left = 0;
for (int i = 0; i < originalString.length; i++) {
if (originalString[i] != ' ' && (i == 0 || originalString[i - 1] == ' ')) {
left = i;
}
if (originalString[i] != ' ' && (i == originalString.length - 1 || originalString[i + 1] == ' ')) {
reverString(originalString, left, i);
}
}
}
private void reverString(char[] originalString, int left, int right) {
while (left < right) {
char temp = originalString[left];
originalString[left] = originalString[right];
originalString[right] = temp;
left++;
right--;
}
}
}
```
Last updated