字符串中等2 种解法

#151反转字符串中的单词

反转单词顺序,并把单词间的任意连续空格规范为一个空格。

#字符串#双指针

解题主线

01

从右向左扫描可按目标顺序直接追加每个单词,无需先反转整个结果。

解法 1拆分后逆序

去除两端空格,按连续空格拆词,反转列表后以单空格连接。

时间复杂度

O(n)

空间复杂度

O(n)

151. 反转字符串中的单词 · 拆分后逆序
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

final class Solution {
    public String reverseWords(String s) {
        String stripped = s.trim();
        if (stripped.isEmpty()) return "";
        List<String> words = Arrays.asList(stripped.split("\\s+"));
        Collections.reverse(words);
        return String.join(" ", words);
    }
}

去除两端空格,按连续空格拆词,反转列表后以单空格连接。

解法 2从右向左双指针

跳过空格后定位单词左右边界,按出现顺序追加到结果。

时间复杂度

O(n)

空间复杂度

O(n),用于返回字符串

151. 反转字符串中的单词 · 从右向左双指针
final class Solution {
    public String reverseWords(String s) {
        StringBuilder result = new StringBuilder(s.length());
        int right = s.length() - 1;
        while (right >= 0) {
            while (right >= 0 && s.charAt(right) == ' ') right--;
            if (right < 0) break;
            int left = right;
            while (left >= 0 && s.charAt(left) != ' ') left--;
            if (!result.isEmpty()) result.append(' ');
            result.append(s, left + 1, right + 1);
            right = left - 1;
        }
        return result.toString();
    }
}

跳过空格后定位单词左右边界,按出现顺序追加到结果。

边界与易错点

  • 结果不能有前导或尾随空格。
  • 全空格输入应返回空串。
  • String.trim 只处理部分空白;本题输入定义为空格字符。
整理来源

由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。

medium/Q151_reverseWords.java