给定一个字符串,逐个翻转字符串中的每个单词。

示例:  

输入: "the sky is blue",
输出: "blue is sky the".

说明:

  • 无空格字符构成一个单词。
  • 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
  • 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

进阶: 请选用C语言的用户尝试使用 O(1) 空间复杂度的原地解法。

 


 

 

//章节 - 数组和字符串    
//五、小结
//3.翻转字符串里的单词
/*
算法思想:
    一种思路是,可以先分割字符串,把分割出来的单词的存在栈中,然后然后从栈中取出赋值到字符串中即可。
*/
//算法实现:
/*
class Solution {
public:
    void reverseWords(string &s) {
        stack<string>st;
        string str="";
        for(int i=0;i<s.size();++i){
            if(s[i]!=' ')
                str+=s[i]+"";
            else{
                st.push(str);
                str="";
            }                           
        }
        s="";
        while(st.size()>1){
            s+=st.top()+" ";
            st.pop();
        }
        s+=st.top();
        st.pop();
    }
};
*/
/*
算法思想:
    使用字符串流类stringstream的解法,我们先把字符串装载入字符串流中,然后定义一个临时变量tmp,然后把第一个单词赋给s,这里需要注意的是,如果含有非空格字符,那么每次>>操作就会提取连在一起的非空格字符,那么我们每次将其加在s前面即可;如果原字符串为空,那么就不会进入while循环;如果原字符串为许多空格字符连在一起,那么第一个>>操作就会提取出这些空格字符放入s中,然后不进入while循环,这时候我们只要判断一下s的首字符是否为空格字符,是的话就将s清空即可。
*/
//算法实现:
class Solution {
public:
    void reverseWords(string &s) {
        istringstream is(s);
        string tmp;
        is >> s;
        while(is >> tmp) 
            s = tmp + " " + s;
        if(!s.empty() && s[0] == ' ') 
            s = "";
    }
};