给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
进阶:
请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。
我的思路:
首先去除首尾空格,然后去除中间空格,最后把整句话翻转,然后逐个单词翻转。
代码1:
class Solution {
public:
string reverseWords(string s) {
//-----找到首尾第一个不是空格的位置
int begin=0;
int ending=s.size()-1;
for(;begin<=ending;)
{
if(s[begin]==' ')++begin;
else if(s[ending]==' ')--ending;
else break;
}
s = s.substr(begin, ending - begin+1);//这里其实可以不用切割字符串的,但是不切割的话代码会变得复杂一点
//-----去除字符串中多余的空格
int restSpace = 0;
int pre = 1, end = 1;
while (end < s.size())
{
if (s[end] == ' '&&s[end - 1] == ' ')
{
end++;
restSpace++;
}
else
{
s[pre] = s[end];
pre++;
end++;
}
}
int size=s.size()-restSpace;//句子实际长度等于当前句子长度减去空格的大小
//-----将字符串进行反转
reverse(s.begin(), s.end()- restSpace);
for (int i = 0, j = 0; j <= size; j++)//将句子的单词逐一翻转,i是当前单词的首部,j是当前单词的尾部
{
if (j == size|| s[j] == ' ')
{
reverse(s.begin() + i, s.begin() + j);
i = j + 1;
}
}
return s.substr(0,size);//切割句子
}
};
代码2:
class Solution {
public:
string reverseWords(string s) {
string ans, str;
stringstream ss(s);
while (ss >> str) {
ans = str+" "+ans;
}
if (ans.size()>0&&ans[ans.length()-1]==' ')
{
ans.pop_back();
}
return ans;
}
};
代码3: