面试经典 150 题 20 —(数组 / 字符串)— 151. 反转字符串中的单词

151. 反转字符串中的单词

面试经典 150 题 20 —(数组 / 字符串)— 151. 反转字符串中的单词_第1张图片

方法一
class Solution {
public:
    string reverseWords(string s) {
        istringstream instr(s);
        vector<string> words{};
        string word;
        while(instr>>word){
            words.push_back(word);
        }
        
        int length = words.size();
        string result = words[length-1];
        for(int i = length - 2 ; i >= 0; i--){
            result = result + " " + words[i];
        }
        return result;
    }
};
方法二
class Solution {
public:
    // 1. 先去除空格
    // 2. 整体反转
    // 3. 每个单词反转
    string reverseWords(string s) {
        int k = 0;
        // 删开头
        while(s[k] == ' '){
            k++;
        }
        s.erase(s.begin(), s.begin() + k);

        // 删末尾 不能一开始就定义length = s.size(),因为s.size()是变化的
        k = s.size() - 1;
        while(s[k] == ' '){
            k--;
        }
        s.erase(s.begin() + k + 1, s.end());

        // 删中间
        int i = 0, j = 0;
        while (i < s.size()) {
            if(s[i] != ' '){
                i++;
            }
            else{
                j = i;
                while(s[j] == ' '){
                    j++;
                }
                if(j-i>1){
                    // erase是左闭右开
                    s.erase(s.begin()+i+1,s.begin()+j);
                }
                // 这里已经是删除完了的,所以加一即可,而不是i=j
                i++;
            }
        }

        // 反转字符串
        reverse(s.begin(), s.end());

        // 反转单词
        int tag = 0;
        for (i = 0; i < s.size(); ++i) {
            if (s[i] == ' ') {
                reverse(s.begin() + tag, s.begin() + i);
                tag = i + 1;
            }
        }
        reverse(s.begin() + tag, s.begin() + i);

        return s;
    }
};

你可能感兴趣的:(leetcode,开发语言,c++,leetcode)