Reverse Words in a String,LeetCode,151

好的,我们来详细讲解一下 LeetCode 上的第 151 题:Reverse Words in a String。

题目描述

给定一个字符串,逐个翻转字符串中的每个单词。

示例 1:

输入: "the sky is blue" 输出: "blue is sky the"

示例 2:

输入: " hello world! " 输出: "world! hello" 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:

输入: "a good example" 输出: "example good a" 解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

说明:

  • 无空格字符构成一个单词。
  • 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
  • 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

解题思路

  1. 去除首尾空格:首先去除字符串首尾的空格,以便后续处理。
  2. 分割字符串:使用空格将字符串分割成单词列表。
  3. 反转列表:将单词列表反转。
  4. 拼接字符串:将反转后的单词列表拼接成一个字符串,单词间用一个空格隔开。

代码实现

以下是使用 Python 实现的代码:

class Solution: def reverseWords(self, s: str) -> str:

Step 1: 去除首尾空格

    s = s.strip()

    # Step 2: 分割字符串
    words = s.split()

    # Step 3: 反转列表
    words.reverse()

    # Step 4: 拼接字符串
    return ' '.join(words)

详细解释

  1. 去除首尾空格s = s.strip() 这一步使用 strip() 方法去除字符串首尾的空格。
  2. 分割字符串words = s.split() 使用 split() 方法按空格分割字符串,默认情况下 split() 会自动处理多个连续空格,只返回有效的单词。
  3. 反转列表words.reverse() 使用 reverse() 方法将单词列表反转。
  4. 拼接字符串return ' '.join(words) 使用 ' '.join(words) 将反转后的单词列表拼接成一个字符串,单词间用一个空格隔开。

复杂度分析

  • 时间复杂度:O(n),其中 n 是字符串的长度。去除首尾空格、分割字符串和拼接字符串的操作都是线性的。
  • 空间复杂度:O(n),用于存储分割后的单词列表。

其他语言实现

如果你需要其他语言的实现,比如 Java 或 C++,可以参考以下代码:

Java 实现

public class Solution { public String reverseWords(String s) { // Step 1: 去除首尾空格 s = s.trim();

    // Step 2: 分割字符串
    String[] words = s.split("\\s+");

    // Step 3: 反转列表
    StringBuilder result = new StringBuilder();
    for (int i = words.length - 1; i >= 0; i--) {
        result.append(words[i]);
        if (i > 0) {
            result.append(" ");
        }
    }

    // Step 4: 返回结果
    return result.toString();
}

}

C++ 实现

#include #include #include #include using namespace std;

class Solution { public: string reverseWords(string s) { // Step 1: 去除首尾空格 trim(s);

    // Step 2: 分割字符串
    istringstream iss(s);
    vector words;
    string word;
    while (iss >> word) {
        words.push_back(word);
    }

    // Step 3: 反转列表
    reverse(words.begin(), words.end());

    // Step 4: 拼接字符串
    string result;
    for (int i = 0; i < words.size(); i++) {
        result += words[i];
        if (i < words.size() - 1) {
            result += " ";
        }
    }

    return result;
}

private: void trim(string& s) { int start = 0, end = s.size() - 1; while (start <= end && s[start] == ' ') start++; while (end >= start && s[end] == ' ') end--; s = s.substr(start, end - start + 1); } };

希望这个详细的解答能帮助你理解和解决这道题目。如果有任何进一步的问题,欢迎继续提问!

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注