给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue
" 输出: "blue is sky the
"
示例 2:
输入: " hello world! " 输出: "world! hello" 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example" 输出: "example good a" 解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
解答:
1.思路:将字符串中的单词逐个提取出来,保存在一个vector中。然后将vector中的单词从尾往前依次提取出来加到一个string中。再补上空格即可。
class Solution {
public:
string reverseWords(string s) {
vector<string> res;
string ss;
//将单词提取出来
res = extWord(s);
if(res.size()==0)
{
return {};
}
//重新组合
for(int k=res.size()-1;k>0;k--)
{
ss+=res[k];
ss+=' ';
}
ss+=res[0];
return ss;
}
public:
vector<string> extWord(string s)
{
int i=0;
vector<string> res;
while(i<s.size())
{
if(s[i]==' ')
{
i++;
continue;
}
string stmp;
for(int j=i;j<s.size();j++)
{
if(s[j]!=' ')
stmp+=s[j];
if(s[j]==' '||j==s.size()-1)
{
res.push_back(stmp);
i=j+1;
break;
}
}
}
return res;
}
};
//缺点1.太麻烦,占用空间大
2.利用c++中的stringstream;
class Solution {
public:
string reverseWords(string s) {
stringstream ss(s);
string ans,temp;
while(ss>>temp)
{
ans = ' ' + temp + ans;
}
if(!ans.empty())
{
ans.erase(ans.begin());
}
return ans;
}
};