LeetCode-151 翻转字符串里的单词 粒子

📝题目

给定一个字符串,逐个翻转字符串中的每个单词。 

示例 1:

输入: "the sky is blue"
输出: "blue is sky the"

示例 2:

输入: "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:

输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。


📝思路

毫不费力的思路:分割出单词->反向拼接
可以用很多方式完成。Java支持库函数split()可以直接以空格为分隔符拆解,trim()筛掉前后空格,几行代码搞定;C++选手可以用stringstream或者手动实现分割拼接,据说此题的出题目的是考察双指针操作字符数组…
我用的正则表达式辅助实现分割,vector容器实现反向拼接…总之题目不是很难,但是手动实现时难免踩到很多坑🤦‍♀️
官方思路和题解请戳此😃

📝题解

string reverseWords(string s) {
    vector<string> words;
    int len = s.size();
    string tmp = "";
    regex reg("[ ]*");//空或纯空格时为真
    for (int i = 0; i < len; ++i){
        if (regex_match(tmp, reg))	tmp = "";
        if (s[i] == ' ' && !regex_match(tmp, reg)){
            words.push_back(tmp);
            tmp = "";
        }
        else {
            tmp += s[i];
        }
    }
    if (!regex_match(tmp, reg))	words.push_back(tmp);

    int len2 = words.size();
    if (len2 == 0) return "";//题目没有讲但是输入为全空格时输出为空,这里容易被坑
    string temp = "";
    for (int i = 0; i < len2-1; ++i){
        temp += words.back();
        temp += " ";
        words.pop_back();
    }
    temp += words.back();
    return temp;
}