翻转字符串里的单词
问题描述:
给定一个字符串,逐个翻转字符串中的每个单词。
示例1:
输入: “the sky is blue”
输出: “blue is sky the”
示例2:
输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例3:
输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
解题思路:
本题考查的是字符串的基本操作,有两点需要注意的是:(1)转换后的字符前后不能有空格;(2)中间出现的多个空格要压缩成一个。
代码如下:
#include<iostream>
#include<vector>
using namespace std;
string reverseWords(string s) {
int i=0;
for(i=0;i<s.size();i++){//删除字符串前面的空格
if(s[i]!=' ')break;
}
s.erase(0,i);
for(i=s.size()-1;i>0;i--){//删除字符串后面的空格
if(s[i]!=' ')break;
}
s.erase(i+1,s.size()-i-1);
vector<string>v;
for(int i=0;i<s.size();i++){
string s1="";
while(i<s.size()){//遇到连续的字符保存在s1中
if(s[i]!=' '){
s1+=s[i];
i++;
}else{
break;
}
}
v.push_back(s1);//放进容器
int flag=0;
while(i<s.size()){
if(s[i]==' '){//出现空格则标志,然后跳过
flag=1;
i++;
}else{
break;
}
}
if(flag){//若出现空格则保存一个空格进容器
v.push_back(" ");
}
i--;
}
string s2="";
for(int i=v.size()-1;i>=0;i--){//将容器的字符串从后往前拿出
s2+=v[i];
}
return s2;
}
int main(){
string s=" the sky is blue ";
cout<<reverseWords(s)<<endl;
return 0;
}