【剑指offer】【双指针】58-I.翻转单词顺序
题目链接:https://leetcode-cn.com/problems/fan-zhuan-dan-ci-shun-xu-lcof/
剑指offer
时间复杂度:O(n)
空间复杂度:O(1)
class Solution {
public:
string reverseWords(string s) {
for(int i = 0; i < s.size(); i++)
{
int j = i;
while(j < s.size() && s[j] != ' ') j++;
reverse(s.begin() + i, s.begin() + j);
i = j;
}
reverse(s.begin(), s.end());
//去除首尾的空格
int k = 0;
while(k < s.size() && s[k] == ' ') k++;
int j = s.size() - 1;
while(j >= 0 && s[j] == ' ') j--;
return s.substr(k, j - k + 1);
}
};
自己实现的版本
class Solution {
public:
string reverseWords(string s) {
int i = 0;
while(i < s.size() && s[i] == ' ') i++;
int j = s.size() - 1;
while(j >= 0 && s[j] == ' ') j--;
s = s.substr(i, j - i + 1);
reverse(s);
s += ' ';
for(int i = 0, j = 0; j < s.size();)
{
if(s[j] != ' ') j++;
else
{
int val = j + 1;
j--;
while(i < j) swap(s[i++], s[j--]);
j = val;
i = val;
}
cout << j << endl;
}
j = s.size() - 1;
while(j >= 0 && s[j] == ' ') j--;
return s.substr(0, j + 1);
}
void reverse(string& s)
{
int i = 0;
int j = s.size() - 1;
while(i < j)
{
swap(s[i], s[j]);
i++;
j--;
}
}
};
leetcode
时间复杂度:O(n)
空间复杂度:O(n)
leetcode增加了难度,多了一些特殊异常情况
class Solution {
public:
string reverseWords(string s) {
if(!s.size()) return "";
//去除首尾的空格
int start = 0, end = s.size() - 1;
while(start < s.size() && s[start] == ' ') start++;
while(end >= 0 && s[end] == ' ') end--;
//空串
if(start >= s.size() || end < 0) return "";
//遍历字符串,先逆置每个单词
int cur = start;
string word = "", ans = "";
while(cur <= end)
{
//不是空格,直接追加到临时word中
if(s[cur] != ' ') word += s[cur], cur++;
else
{
//过滤字符串中间的掉空格
while(s[cur] == ' ') cur++;
//逆置word
reverse_str(word);
ans += word + ' ';
word = "";
}
}
reverse_str(word);
ans += word;
//逆置整个字符串
reverse_str(ans);
return ans;
}
void reverse_str(string &word)
{
int i = 0, j = word.size() - 1;
while(i < j) swap(word[i++], word[j--]);
}
};
双指针
时间复杂度:O(n)
空间复杂度:O(1)
借助substr函数实现
class Solution {
public:
string reverseWords(string s)
{
if(!s.size()) return "" ; //特判
s.erase(0,s.find_first_not_of(" "));
s.erase(s.find_last_not_of(" ") + 1);
int n = s.size() - 1;
int i = n, j = n + 1;
string res;
while(i >= 0)
{
while(i >= 0 && s[i] != ' ') i--; //先判断i是否大于等于0,再判断s[i],否则可能会越界
// cout<<i<<","<<j<<","<<s.substr(i + 1, j - i)<<","<<endl; //调试程序
res += s.substr(i + 1, j - i) + ' ';
while(i >= 0 && s[i] == ' ') i--; //先判断i是否大于等于0,再判断s[i],否则可能会越界
j = i;
}
res.erase(res.find_last_not_of(" ") + 1);
return res; //返回结果
}
};
知识的价值不在于占有,而在于使用