Description
https://leetcode.com/problems/reverse-words-in-a-string/
给定一个字符串,按单词反转。要求忽略前导、尾部空格,单词间的多余空格保留一个。
Input: "the sky is blue",
Output: "blue is sky the".
Solving Ideas
类似 《剑指offer》 翻转单词顺序,不同的是多了多余空格的处理,基本思想是一致的,首先翻转整个字符串,然后逐个翻转单词。
对于多余空格的处理,为了不使用额外辅助空间,采用了向前覆盖的方法,也就是在遍历反转每个单词的同时,将每个单词向前移动,以去除多余的空格。
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
n
)
O(n)
O(n)
Solution
public class Solution {
public String reverseWords(String s) {
if (s == null || s.length() == 0) return s;
char[] str = s.toCharArray();
//reverse the whole string
reverse(str, 0, str.length - 1);
//调整后,当前满足条件的部分的尾部的索引
int cur = 0;
//reverse each word
for (int i = 0; i < str.length; i++) {
if (str[i] == ' ') continue;
if (cur != 0) str[cur++] = ' ';
//当前需要反转单词的首部的索引
int wordBegin = cur;
while (i < str.length && str[i] != ' ') str[cur++] = str[i++];
reverse(str, wordBegin, cur - 1);
}
return new String(str, 0, cur);
}
private void reverse(char[] str, int left, int right) {
while (left < right) {
char tmp = str[left];
str[left++] = str[right];
str[right--] = tmp;
}
}
}