给定一个字符串,逐个翻转字符串中的每个单词。
说明:
无空格字符构成一个 单词 。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
示例 1:
输入:"the sky is blue"
输出:"blue is sky the"
示例 2:
输入:" hello world! "
输出:"world! hello"
解释:输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-words-in-a-string
解题思路
用左右指针,先过滤掉最左最右的空格
然后用一个双端队列,一个StringBuilder
StringBuilder
用于拼接字符成一个完整的单词
双端队列用于拼接这些单词,并且都是添加到头部,达到逆序的目的
最后用空格拼接队列中的字符串
代码
class Solution {
public String reverseWords(String s) {
int left = 0, right = s.length() - 1;
// 跳过左右的空格
while (left <= right && s.charAt(left) == ' ') {
left++;
}
while (left <= right && s.charAt(right) == ' ') {
right--;
}
Deque<String> deque = new LinkedList<>();
StringBuilder word = new StringBuilder();
while (left <= right) {
char ch = s.charAt(left);
if (ch == ' ') {
if (word.length() != 0) {
deque.offerFirst(word.toString()); // 添加到头部
word.setLength(0); // 清空
}
} else {
word.append(ch);
}
left++;
}
deque.offerFirst(word.toString());
return String.join(" ", deque);
}
}