题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
解题思路
分析题意,本质上就是完成字符串的反转,只不过这里不是以单个字符为单位进行反转,而是以空格为分隔符划分单词,最后以单词为单位翻转字符串。
例如:给定字符串“student. a am I”,以空格为分隔符划分得到单词序列为:"student."、"a"、"am"、"I",对单词序列进行翻转操作后有:“I am a student.”
注意细节:翻转后的字符串首尾不能有空格,如果给定字符串全部是空格,则直接返回原字符串。
明白了题意,这题就很简单了,可以使用辅助空间完成反转,例如栈,将每一个单词顺序进栈,最后出栈,就是完成了反转,比较简单,这里不再进行实现。
下面复习一下C++库函数istringstream和ostringstream,这两个函数都包含在头文件sstream中。
istringstream是对字符串进行操作的输入流类。该类的对象使用一个包含字符序列的字符串缓冲区。这个字符序列可以作为一个字符串对象直接访问,其构造函数原型如下:
istringstream::istringstream(string str);
它的作用是从 string 对象 str 中读取字符。
class Solution {
public:
string ReverseSentence(string str) {
if(str.empty()) return str;
int i=0,len=str.length();
while(i<len && str[i] == ' ') ++i;
if(i==len) return str; //如果给定字符串全部是空格,则直接返回
istringstream ss(str);
stack<string> st;
string temp;
while(ss>>temp){
st.push(temp);
}
ostringstream res;
while(!st.empty()){
res<<st.top()<<' ';
st.pop();
}
return res.str().substr(0,len); //去掉最后的空格
}
};
基于以上思路,自己实现拆分单词的操作
class Solution1{
public:
string ReverseSentence(string str) {
if(str.empty()) return str;
int i=0,len=str.length();
while(i<len && str[i] == ' ') ++i;
if(i==len) return str;
string res="";
string word=" ";
i=0;
while(i<len){
if(str[i] != ' '){
word += str[i];
}
else{
res = word+res;
word=" ";
}
++i;
}
res = word.substr(1)+res;
return res.substr(0,len); //去除最后的一个空格
}
};
网友评论