解题思路
首先判断输入的字符串是否为空串,若为空串则直接返回; 否则
- 第一步:将字符串两端的空格去除,得到一个新的字符串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;
}
};