【剑指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;                         //返回结果
    }
};
posted @ 2020-04-09 22:06  NaughtyCoder  阅读(103)  评论(0)    收藏  举报