翻轉字符串裏的單詞
問題描述:
給定一個字符串,逐個翻轉字符串中的每個單詞。
示例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;
}