Poison

557. Reverse Words in a String III

Stack
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public String reverseWords(String s) {
StringBuilder sb = new StringBuilder();

Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == ' ') {
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
sb.append(c);
} else {
stack.push(c);
}
}

while (!stack.isEmpty()) {
sb.append(stack.pop());
}

return sb.toString();
}
}
Two Pointers
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public String reverseWords(String s) {
StringBuilder sb = new StringBuilder();

int i = 0;
while (i < s.length()) {
int startIndex = i;
while (i < s.length() && s.charAt(i) != ' ') {
i++;
}
// 跳出时 i 位于字符串末端或者 i 停留在空格上

for (int k = i - 1; k >= startIndex; k--) {
sb.append(s.charAt(k));
}

while (i < s.length() && s.charAt(i) == ' ') {
sb.append(' ');
i++;
}
}

return sb.toString();
}
}
Two Pointers
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public String reverseWords(String s) {
char[] charArray = s.toCharArray();

int i = 0;
while (i < charArray.length) {
int startIndex = i;
while (i < charArray.length && charArray[i] != ' ') {
i++;
}

int left = startIndex, right = i - 1;
while (left < right) {
swap(charArray, left++, right--);
}

while (i < charArray.length && charArray[i] == ' ') {
i++;
}
}

return new String(charArray);
}

private void swap(char[] chars, int i, int j) {
char tmp = chars[i];
chars[i] = chars[j];
chars[j] = tmp;
}
}
Reference

557. Reverse Words in a String III