PROBLEM

剑指 Offer 58 - I. 翻转单词顺序

难度 简单

MY ANSWER

使用栈读入单词,时间空间复杂度O(n)。还可使用双指针,从尾向前遍历,思路相似。

class Solution {
public:
string reverseWords(string s) {
stack<string> voc;
int start = 0, len = 1, flag = 0;
cout<<isgraph(' ')<<endl;
for(int i = 0; i < s.size(); i++) {
if(!flag && isgraph(s[i])) {
start = i;
len = 1;
flag = 1;
}
else if(flag && isgraph(s[i])) {
len++;
}
if(!isgraph(s[i]) && flag || i == s.size() - 1 && isgraph(s[i]) && flag) {
voc.push(s.substr(start, len));
flag = 0;
}
}
string res;
while(voc.size()) {
res += voc.top() + " ";
voc.pop();
}
res.pop_back();
return res;
}
};

BETTER SOLUTION

使用istringstream流,可以将字符串按空格分隔输出。时间空间复杂度O(n)。

class Solution {
public:
string reverseWords(string s) {
istringstream ss(s);
string res, str;
while(ss >> str)
res = str + ' ' + res;
return res.substr(0, res.size() - 1);
}
};

SUMMARY

学习使用istringstream:

istringstream ss(s);将字符串赋值给流;

ss >> str将流输出到str,每次输出按空格分隔的字符串。如

string str="i am a boy";  
istringstream is(str);
string s;
while(is>>s)
{
cout<<s<<endl;
}

输出:

i

am

a

boy