题目链接
https://leetcode.cn/problems/reverse-words-in-a-string/solution/fan-zhuan-zi-fu-chuan-li-de-dan-ci-by-leetcode-sol/
题解
题解一(Java)
作者:@仲景
看到倒序第一反应是使用栈
class Solution {
public String reverseWords(String s) {
// 遍历字符串
StringBuilder sb = new StringBuilder();
LinkedList<String> stack = new LinkedList<>();
int i = 0;
while (i < s.length()) {
while (i < s.length() && s.charAt(i) == ' ') {
// 一个单词读完就把单词压入到栈中
if (sb.length() != 0) {
stack.push(sb.toString());
sb = new StringBuilder();
}
i++;
}
// 防止越界
if (i == s.length())
break;
sb.append(s.charAt(i++));
}
// 防止最后一个单词没有入栈
if (sb.length() != 0)
stack.push(sb.toString());
// 出栈
sb = new StringBuilder();
while (stack.size() > 1)
sb.append(stack.pop() + " ");
if (stack.peek() != null)
sb.append(stack.pop());
return sb.toString();
}
题解二(Java)
作者:@仲景
不使用栈来逆转字符串,直接使用集合来逆转
class Solution {
public String reverseWords(String s) {
StringBuilder sb = new StringBuilder();
// 字符串集合
List<String> list = new ArrayList<>();
// 遍历字符串
int i = 0;
int len = s.length();
while (i < len) {
while (i < len && s.charAt(i) == ' ') {
if (sb.length() != 0) {
list.add(sb.toString());
sb = new StringBuilder();
}
i++;
}
if (i == len)
break;
sb.append(s.charAt(i++));
}
if (sb.length() != 0)
list.add(sb.toString());
// 翻转list
Collections.reverse(list);
return String.join(" ", list);
}
}
题解三(Java)
作者:@仲景
手动实现各个步骤
class Solution {
public String reverseWords(String s) {
// 移除首尾空格和中间多余空格
StringBuilder sb = removeSpace(s);
// 翻转整个字符串
reverStringBuilder(sb, 0, sb.length() - 1);
// 翻转字符串中各个单词
reverseEachWord(sb);
return sb.toString();
}
/**
* 移除首尾空格和中间多余空格
*/
public StringBuilder removeSpace(String s) {
int left = 0;
int right = s.length() - 1;
// 移除前面的空格
while (s.charAt(left) == ' ')
left++;
// 移除后面的空格
while (s.charAt(right) == ' ')
right--;
// 移除中间的空格
StringBuilder sb = new StringBuilder();
while (left <= right) {
char c = s.charAt(left);
// 如果当前字符不为空格,或者sb最后一个不为空格(还没有添加过空格),就添加
if (c != ' ' || sb.charAt(sb.length() - 1) != ' ')
sb.append(c);
left++;
}
return sb;
}
/**
* 翻转整个StringBuilder
*/
public void reverStringBuilder(StringBuilder sb, int left, int right) {
while (left < right) {
char temp = sb.charAt(left);
sb.setCharAt(left, sb.charAt(right));
sb.setCharAt(right, temp);
left++;
right--;
}
}
/**
* 翻转中间只有一个空格,首尾没有空格的StringBuilder
*/
private void reverseEachWord(StringBuilder sb) {
int left = 0;
int right = 1;
while (left < sb.length()) {
// 找到一个单词后面的空格
while (right < sb.length() && sb.charAt(right) != ' ')
right++;
// 翻转这个单词
reverStringBuilder(sb, left, right - 1);
// 继续下一个单词
left = right + 1;
right = left + 1;
}
}
}