题目描述:
给你一个字符串 s ,逐个翻转字符串中的所有 单词 。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。
示例:
输入: s = “the sky is blue”
输出: “blue is sky the”输入: " hello world "
输出: “world hello”
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Solution
{
public:
string reverseWords(string s) {
vector<string> strArr;
string tmp = "";
int step = 0;
for(int i=s.length()-1; i>=-1; i--){
if(i != -1 && s[i] != ' '){
++step;
continue;
}
for(int j=1; j<=step; j++){
tmp += s[i+j];
}
if(tmp != "" && tmp != " "){
strArr.push_back(tmp);
tmp = "";
step = 0;
}
}
if(strArr.empty()){
return "";
}
tmp = strArr[0];
for(int i=1; i<strArr.size(); i++){
tmp += (" " + strArr[i]);
}
return tmp;
}
};
int main()
{
string str = " Alice does not even like bob ";
Solution solution;
string result = solution.reverseWords(str);
cout << result << endl;
return 0;
}
方法二、双端队列
class Solution {
public:
string reverseWords(string s) {
int left = 0, right = s.size() - 1;
// 去掉字符串开头的空白字符
while (left <= right && s[left] == ' ') ++left;
// 去掉字符串末尾的空白字符
while (left <= right && s[right] == ' ') --right;
deque<string> d;
string word;
while (left <= right) {
char c = s[left];
if (word.size() && c == ' ') {
// 将单词 push 到队列的头部
d.push_front(move(word));
word = "";
}
else if (c != ' ') {
word += c;
}
++left;
}
d.push_front(move(word));
string ans;
while (!d.empty()) {
ans += d.front();
d.pop_front();
if (!d.empty()) ans += ' ';
}
return ans;
}
};