翻转单词顺序

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

思路

先把整个字符串反转,然后挨个单词反转,再处理空格。

代码

class Solution {
public:
    void reverse(string& s,int left,int right) {
        while(left < right) {
            char tmp = s[left];
            s[left] = s[right];
            s[right] = tmp;
            left++;
            right--;
        }
    }
    string reverseWords(string s) {
        int len = s.length();
        reverse(s,0,len-1);
        int left = 0,right=0;
        for(int i = 0;i < len;i++) {
            if(s[i] == ' ') {
                right = i-1;
                reverse(s,left,right);
                left = i+1;
            }
            else if(i == len-1) {
                reverse(s,left,i);
            }
        }
        //处理空格
        string ans;
        bool preHasSpace = false;
        bool hasAl = false;
        for(int i = 0;i < len;i++) {
            if(s[i] != ' ') {
                if(preHasSpace) {
                    ans.push_back(' ');
                    preHasSpace = false;
                }
                ans.push_back(s[i]);
                hasAl = true;
            }
            else {
                if(hasAl) {
                    preHasSpace = true;
                }
            }
        }
        return ans;
    }
};