问题描述:
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入: "Let's take LeetCode contest"
输出: "s'teL ekat edoCteeL tsetnoc"
注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-words-in-a-string-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
执行结果:
代码描述:
- 方法一:
遇到空格,则把一个单词放入stack 栈中,然后弹栈,将其反转输出,继续扫描下一个单词,依次类推。需要注意判断最后一个单词,并且加入到 str 中,返回。
时间复杂度O(n), 空间复杂度O(n)。
class Solution {
public:
string reverseWords(string s) {
string str = "";
if(s.size() == 0) return str;
stack<char> stk;
for(int i = 0; i < s.size(); ++i)
{
if(isspace(s[i]))
{
if(stk.size() != 0)
{
int len = stk.size();
while(len)
{
str += stk.top();
stk.pop();
--len;
}
str += " ";
}
}
else
{
stk.push(s[i]);
}
}
if(stk.size() != 0)
{
int len = stk.size();
while(len)
{
str += stk.top();
stk.pop();
--len;
}
}
return str;
}
};
- 方法二:
借助swap函数,每个单词原地翻转。时间复杂度O(n), 空间复杂度O(1)。
class Solution {
public:
string reverseWords(string s) {
if(s.size() == 0) return s;
int begin = 0, end = 0;
for(int i = 0; i < s.size()+1; ++i) // 由于最后一个字符为 \0 需要额外+1
{
if(s[i] == ' ' || s[i] == '\0')
{
for(end = i-1; begin < end; ++begin, -- end)
{
swap(s[begin], s[end]);
}
begin = i+1;
}
}
return s;
}
};