好的,我们来详细讲解一下 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"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
- 无空格字符构成一个单词。
- 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
- 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
解题思路
- 去除首尾空格:首先去除字符串首尾的空格,以便后续处理。
- 分割字符串:使用空格将字符串分割成单词列表。
- 反转列表:将单词列表反转。
- 拼接字符串:将反转后的单词列表拼接成一个字符串,单词间用一个空格隔开。
代码实现
以下是使用 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)
详细解释
-
去除首尾空格:
s = s.strip()
这一步使用strip()
方法去除字符串首尾的空格。 -
分割字符串:
words = s.split()
使用split()
方法按空格分割字符串,默认情况下split()
会自动处理多个连续空格,只返回有效的单词。 -
反转列表:
words.reverse()
使用reverse()
方法将单词列表反转。 -
拼接字符串:
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
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); } };
希望这个详细的解答能帮助你理解和解决这道题目。如果有任何进一步的问题,欢迎继续提问!
发表回复