解题思路

首先判断输入的字符串是否为空串,若为空串则直接返回; 否则

  • 第一步:将字符串两端的空格去除,得到一个新的字符串str;
  • 第二步:以字符串str中的空格为分隔符,将str进行分隔得到其中的单词

其中在分隔单词时,由于第二步将字符串左右两端的空格都去除掉了,所以以空格为分隔符分隔最后一个单词时,返回的值是string::npos; 对此种特殊情况需加以判断,如果遇到这种情况则直接将单词入栈。

  • 第三步:从左往右,顺序的将每个单词入栈;
  • 第四步:将栈中的单词输出并加上空格即可得到翻转后的单词序列

由于每输出一个单词都在其后加上一个空格,所以输出最后一个单词后加上的空格必须被删除才符合题意。

class Solution {
public:
    string ReverseSentence(string str) {
        if(0 == str.size())
            return str;
        stack<string> sk;
        size_t i = 0, j = str.size()-1;
        // 第一步
        while(str[i] == ' ')
            ++i;
        while(str[j] == ' ')
            --j;
        str = str.substr(i, j-i +1);
        
        // 第二步
        while(str.size() != 0)
        {
            int len = str.find(' ',0);
            if( string::npos == len)
            {
                string tmp = str.substr(0,str.size());
                sk.push(tmp);    // 第三步
                break;
            }
            string tmp = str.substr(0,len);
            sk.push(tmp);        // 第三步
            str = str.substr(len+1,str.size());
        }
        
       // 第四步
        string cur_str;
        while(!sk.empty())
        {
            cur_str += sk.top()+" ";
            sk.pop();
        }
        cur_str.erase(cur_str.size()-1,1); // 删除最后一个空格
        
        return cur_str;
    }
};

程序运行结果

alt