给定一个字符串,逐个翻转字符串中的每个单词。
示例:
输入:"the sky is blue"
输出:"blue is sky the"
说明:
- 无空格字符构成一个单词。
- 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
- 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
进阶: 请选用C语言的用户尝试使用 O(1) 空间复杂度的原地解法。
/*解法1:C++ 利用stack*/
class Solution {
public:
void reverseWords(string &s) {
stack<string> des;
if(s.empty())
return;
int len = s.size();
for(int i=0; i<len; ++i)
{
if(s[i] == ' ')
continue;
string word;
while(i<len && s[i]!=' ')
{
word += s[i];
i++;
}
des.push(word);
}
if(des.empty())
s = "";
else
{
s.clear();
int j;
int stacksize = des.size();
for(j=0; j<stacksize-1; ++j)
{
s += des.top();
des.pop();
s += ' ';
}
s += des.top();
}
}
};
/*解法2:C 先翻转每个单词 再翻转整个字符串*/
void reverseWords(char *s) {
int len = strlen(s);
if(s==NULL || len==0)
return;
int begin = 0; //整个字符串当前处理位置
int cur = begin; //单个单词的起始
int end = begin; //单个单词的结束
//先翻转单个单词
while(true)
{
int length = 0; //单个单词长度
while(s[cur] == ' ')
{
cur++;
end++;
}
while(s[end]!=' ' && s[end]!='0')
{
end++;
length++;
}
if(s[end] == ' ') //单个单词结束
{
reverse(s, cur, end);
if(begin != 0)
s[begin] = ' ';
for(int i=0; i<length; ++i)
{
s[begin++] = s[cur++];
}
}
else if(s[end] == '0')
{
s[begin] = '0';
break;
}
}
//再翻转整个句子
reverse(s, 0, begin);
}
void reverse(char *s, int begin, int end)
{
int sbeg = begin;
int send = end - 1;
while(begin < end)
{
s[sbeg++] = s[send--];
}
}
#Python:一行代码即可完成..........就是这么任性~
class Solution(object):
def reverseWords(self, s):
"""
:type s: str
:rtype: str
"""
return ' '.join(sub[::-1] for sub in s[::-1].split())