2020/2/5 二刷
substr(字符串,截取开始位置,截取长度)
题目描述
解法 istringstream
class Solution {
public:
string reverseWords(string s) {
if(s.size() == 0) return "";
stack <string> stk;
string tem, ans;
istringstream ss(s);
while(ss >> tem) {
stk.push(tem);
stk.push(" ");
}
if(!stk.empty()) stk.pop();
while(!stk.empty()) {
ans += stk.top();
stk.pop();
}
return ans;
}
};
很明显这里利用堆栈把所有字母倒过来了,然后去掉多出来的一个空格,由于去掉栈首比较方便,我们先push字符串再push空格。
时间复杂度和空间复杂度都不太懂,插个眼改日研究。
这里其实不用堆栈也能做
每次都把字母塞到前面,最后去掉第一次多出来的空格就行。
class Solution {
public:
string reverseWords(string s) {
string tem, ans;
istringstream ss(s);
while(ss >> tem) {
ans = tem + ' ' + ans;
}
return ans.substr(0, ans.size() - 1);
}
};
第二个空间复杂度好像高很多
可能是使用substr的问题,于是改成 ans . pop_back试试。
解法 双指针法
总所周知,这种题目肯定可以双指针
j从最后一个下标开始,找到一个不为空格的字符,就定义一个i从j - 1开始往前找,直到找到空格为止,将此间的字符放入答案。然后让j = i ,继续往前寻找。
ps:要注意最后一个字符前没有空格,这时候i到0就必须停止。
class Solution {
public:
string reverseWords(string s) {
if(s.size() == 0) return "";
int j = s.size() - 1;
string ans;
for(;j >= 0; --j) {
//跳过空格
if(s[j] == ' ') continue;
int i = j - 1;
while(i >= 0 && s[i] != ' ') i--;
//i + 1 到 j组成一个单词
for(int k = i + 1; k <= j; k ++) ans.push_back(s[k]);
//push_back添加一个字符
ans.push_back(' ');
j = i;
}
if(s.size() > 0) return ans.substr(0, ans.size() - 1);
return "";
}
};
时间复杂度O(N)
空间复杂度O(N)