151. 翻转字符串里的单词 ( 三种实现)

题目要点:

1:字符串首尾都有可能存在多余的空格

2:字符串中间单词之间又可能存在连续多个空格

解法1:从字符串手择单词,放到一个缓存数组里

class Solution {
private:
    //传入字符串的左下标,确定单词的有效左右下标,右下标指向单词的下一位
    bool getWord(const string& s, int len, int& left, int& right) {
        while (left < len && s[left] == ' ')
            left++;
        if (left >= len)
            return false;
        right = left + 1;
        while (right < len && s[right] != ' ')
            right++;
        return true;
    }
public:
    string reverseWords(string s) {
        int len = s.length();
        int left = 0, right;
        vector<string> str;
        string res = "";

        bool flag = getWord(s, len, left, right);  //择出来所有单词
        while (flag) {
            str.push_back(s.substr(left, right - left));
            left = right + 1;
            flag = getWord(s, len, left, right);
        }

        int strLen = str.size();                   //连接所有单词
        if (strLen == 0)
            return res;
        res = str[0];
        for (int i = 1; i < strLen; i++)
            res = str[i] + ' ' + res;

        return res;
    }
};

解法2:在解法1基础上,直接连接单词,不用缓存数组

class Solution {
private:
    bool getWord(const string& s, int len, int& left, int& right) {
        while (left < len && s[left] == ' ')
            left++;
        if (left >= len)
            return false;
        right = left + 1;
        while (right < len && s[right] != ' ')
            right++;
        return true;
    }
public:
    string reverseWords(string s) {
        int len = s.length();
        int left = 0, right;
        string res = "";

        bool flag = getWord(s, len, left, right); 
        while (flag) {
            if (res != "")
                res = s.substr(left, right - left) + ' ' + res;
            else 
                res = s.substr(left, right - left);
            left = right + 1;
            flag = getWord(s, len, left, right);
        }

        return res;
    }
};

解法3:利用stringstream,需要额外处理单词后面多余空格

class Solution {
public:
    string reverseWords(string s) {
        string tmp, res = "";
        stringstream ss(s);

        int right;
        while (getline(ss, tmp, ' ')) { //以一个空格符分割,每个单词可能还有多余的空格
            if (tmp == "")              //多个连续空格情况
                continue;

            right = tmp.length() - 1;   //处理单词后面额外空格
            while (right > 0 && tmp[right] == ' ')
                right--;
            tmp = tmp.substr(0, right + 1);
            //printf("tmp = %s\n", tmp.c_str());

            if (res != "")              //连接单词
                res = tmp + ' ' + res;
            else
                res = tmp;
        }

        return res;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值