第一种做法,直接从后向前遍历
注意字符串的子串获取方法
class Solution {
public:
string reverseWords(string s) {
string res;
int i = s.size()-1;
int count = 0;
while(i>=0){//遍历每一个字符
count = 0;
//如果是空格则不处理
//要把i>=0写在前边,否则会超时
while(i>=0 && s[i]==' '){
i--;
}
//如果是非空格,则记录个数
while(i>=0 && s[i]!=' '){
i--;
count++;
}
if(count>0){
res = res + s.substr(i+1,count)+" ";
}
}
//去掉最后的那个空格
return res.substr(0,res.size()-1);
}
};
第二种方法:先去除多余空格,再翻转整个字符串,再翻转逐个单词
注意reverse函数的用法
注意erase函数的用法,erase删除某个字符以后,字符串的长度会改变,指针指向的位置也会改变,注意!!
class Solution {
public:
//第二种方法,先去除多余空格,然后进行字符串反转,然后再进行单词逐个反转
string eraseExtra(string & s){
//先去除前面的空格
while(s.size()>0){
if(s[0]!=' '){
break;
}else{
s.erase(s.begin());
}
}
//再去除后边的空格
for(int i=s.size()-1;i>=0;i--){
if(s[i]!=' '){
break;
}else{
s.erase(s.begin()+i);
}
}
//再去除中间的多余的空格
for(int i=0;i<s.size();i++){
if(i+1<s.size() && s[i]==' '&&s[i]==s[i+1]){
s.erase(s.begin()+i);
i = i-1;//注意,字符串删除字符以后,字符串的大小会改变,i指向的位置也会变
}
}
return s;
}
string reverseWords(string s) {
s = eraseExtra(s);
reverse(s.begin(),s.end());
//翻转单词
for(int i=0;i<s.size();i++){
int j=i;
while(j<s.size() && s[j]!=' '){
j++;
}
reverse(s.begin()+i,s.begin()+j);
i=j;
}
return s;
}
};
第三种方法,利用栈先入后出的特性
class Solution {
public:
//第三种方法,利用栈先入后出的特性
string reverseWords(string s) {
stack<string> stk;
string word;
for(int i=0;i<s.size();i++){
if(s[i]!=' '){
word += s[i];
if(s[i+1]==' '||i==s.size()-1){
stk.push(word);
word="";
}
}
}
string ans;
while(stk.empty()!=true){
ans += stk.top();
stk.pop();
if(stk.empty()!=true){
ans += " ";
}
}
return ans;
}
};