151. 反转字符串中的单词

题目

image-20240914163403002

题解

最先想到是自己去拆解,这里介绍一种新的方法,stringstream,同时,虽然可以通过对原来的空格进行erase操作来实现,但是频繁的改变这东西会导致stirng频繁重新分配内存,建议少用,看看下面的 拆解 的标准答案。

代码

拆解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public:
string reverseWords(string s) {
ranges::reverse(s);

int n = s.length();
int idx = 0;
for (int i = 0; i < s.length(); i++)
{
if(s[i] != ' ') //跳过空格
{
if(idx != 0) s[idx++] = ' '; //除去第一个单词外,剩下的单词都要在首部添加一个空格

int end = i;

while(end < n && s[end] != ' ') s[idx++] = s[end++]; //将原有的单词位移

reverse(s.begin() + idx - (end - i),s.begin() + idx); //正确翻转

i = end; //跟踪新的尾部
}
}

s.erase(s.begin() + idx,s.end()); //删除string后多余的部分
return s;
}
};

stringstream

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public:
string reverseWords(string s) {
stringstream ss(s); //可以自动根据空格来拆分字符串
string word;
vector<string> words;

// 使用stringstream将单词提取并存入vector
while (ss >> word) {
words.push_back(word);
}

// 反转所有单词
reverse(words.begin(), words.end());

// 使用 join 操作将单词拼接回结果字符串
string result;
for (int i = 0; i < words.size(); ++i) {
if (i > 0) {
result += " "; // 在单词之间添加空格
}
result += words[i];
}

return result;
}
};

同时提醒在C++对字符串采用stringstream的方式进行分解的话可以指定分隔符号。具体使用说明可以看下面的例子。

1
2
3
4
5
6
7
8
9
10
11
12
std::vector<std::string> splitString(const std::string& str, char delimiter) {  
std::vector<std::string> result;
std::stringstream ss(str);
std::string token;

// 使用 getline 以特定字符为分隔符来读取子字符串
while (std::getline(ss, token, delimiter)) {
result.push_back(token);
}

return result;
}