给定一个字符串,逐个翻转字符串中的每个单词。
示例:
输入: "the sky is blue",
输出: "blue is sky the".
说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
进阶: 请选用C语言的用户尝试使用 O(1) 空间复杂度的原地解法。
方法一:使用栈的先进后出的特性,将每个单词读入栈,然后依次出栈合并即可。(时间复杂度O(n),额外的空间复杂度O(n))
class Solution {
public:
void reverseWords(string &s) {
stack<string> myStrStack;//辅助栈
int strSize = s.size();//扫描s串,将所有的单词放入栈中
for (int index = 0; index < strSize; ) {
//跳过空格
while (index < strSize && s[index] == ' ') {
++index;
}
if (index >= strSize) {
break;
}
//确定单词的尾部下标
int endIndex = index;
while (endIndex < strSize && s[endIndex] != ' ') {
++endIndex;
}
//将这个单词截取出来
string tempStr = s.substr(index, endIndex - index);
myStrStack.push(tempStr);//放入栈中
index = endIndex + 1;
}
s = "";//清空s串
//将栈中的所有的单词按照顺序读出
if (!myStrStack.empty()) {
s += myStrStack.top();
myStrStack.pop();
}
while (!myStrStack.empty()) {
s += " " + myStrStack.top();
myStrStack.pop();
}
}
};
方法二:先将整个字符串翻转,然后翻转单词,再去掉多余的空格。(时间复杂度O(n),额外的空间复杂度O(1))
class Solution {
public:
void reverseWords(string &s) {
int strSize = s.size();//扫描s串
//将字符串全部翻转
reverse(s.begin(), s.end());
s.erase(0, s.find_first_not_of(" "));//去除字符串前多余的空格
s += ' ';
//然后将中间的单词翻转
for (int i = 0, x = 0; i < s.size(); ++i) {
if (s[i] == ' ') {
reverse(s.begin() + x, s.begin() + i);
x = i + 1;
for (int j = i + 1; j < s.size(); ++j) {
if (s[j] != ' ') {//移除多余空格
s.erase(i + 1, j - (i + 1));
break;
}
}
}
}
s.erase(s.find_last_not_of(" ") + 1);//去除字符串尾部多余的空格
}
};