💵个人主页: 起名字真南
💵个人专栏:【数据结构初阶】 【C语言】 【C++】 【OJ题解】
题目要求:给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
题目链接: 反转字符串中的所有单词
反转字符串中每个单词的字符顺序
题目描述
给定一个字符串 s
,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例
-
输入:
s = "Let's take LeetCode contest"
-
输出:
"s'teL ekat edoCteeL tsetnoc"
-
输入:
s = "Mr Ding"
-
输出:
"rM gniD"
解题思路
-
识别单词:
- 首先需要遍历字符串,找到每个单词的起始和结束位置。单词由字母组成,空格用来分隔单词。
-
反转单词:
- 对于每个找到的单词,利用字符串反转的功能,将单词的字符顺序进行反转。
-
构建结果:
- 在保持原有空格和单词顺序的基础上,将反转后的单词拼接成最终的结果字符串。
-
边界处理:
- 需要考虑多个空格的情况,确保反转后的字符串仍然保留原始的空格格式。
具体实现步骤
- 使用
stringstream
或直接遍历字符串来识别单词。 - 将每个单词反转,并存储在一个结果字符串中。
- 将结果字符串中的单词拼接在一起,并保持空格的原始位置。
C++ 示例代码
以下是根据上述思路实现的 C++ 代码:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
class Solution {
public:
string reverseWords(string s) {
stringstream ss(s);
string word;
string result;
while (ss >> word) { // 逐个读取单词
reverse(word.begin(), word.end()); // 反转单词
result += word + " "; // 拼接反转后的单词
}
if (!result.empty()) {
result.pop_back(); // 移除最后多余的空格
}
return result;
}
};
int main() {
Solution solution;
string s = "Let's take LeetCode contest";
string result = solution.reverseWords(s);
cout << result << endl; // 输出: "s'teL ekat edoCteeL tsetnoc"
return 0;
}
代码解析
stringstream
:用于便捷地读取字符串中的单词。reverse
:C++ STL 提供的反转功能,用于反转单个单词。- 结果拼接:将反转后的单词拼接到结果字符串中,并在每个单词后加上空格,最后再移除多余的空格。
总结
这个算法的时间复杂度为 O(n),其中 n 是字符串 s
的长度。通过这种方式,我们不仅实现了题目的要求,还保持了原始字符串的结构与格式。