LeetCode笔记:557. Reverse Words in a String III

问题(Easy):

Given a string, you need to reverse the order of characters in each word within a sentence while still preserving whitespace and initial word order.

Example 1:
Input: "Let's take LeetCode contest"
Output: "s'teL ekat edoCteeL tsetnoc"

Note: In the string, each word is separated by single space and there will not be any extra space in the string.

大意:

给出一个字符串,你需要翻转句子中每个单词的字母,但保证空格位置以及原始的单词顺序不变。

例1:
输入:"Let's take LeetCode contest"
输出: "s'teL ekat edoCteeL tsetnoc"

注意:在字符串中,每个单词都被单个空格分开,不会有额外的空格。

思路:

遍历字符串,没遇到一个空格就开始处理前面的这个单词,将其用一些方式进行反转后存入新的字符串中,然后记得在新字符串后面加个空格(最后一个单词就不要加空格了)。

如何对单词反转有多种方式,可以用一个临时容器来存储,遇到单词中每个字母都将其插入到容器首部,然后再将整个容器的内容放到字符串中就好了。这个容器可以是deque这种允许两端插入的,也可以就是string。但是用string(49ms)居然比用在首部插入应该更快的deque(768ms)要快得多。

代码(C++):

// 用deque
class Solution {
public:
    string reverseWords(string s) {
        deque que;
        string res = "";
        for (int i = 0; i < s.length(); i++) {
            if (s[i] != ' ') {
                que.push_front(s[i]);
            } else {
                auto iter = que.begin();
                while (iter != que.end()) {
                    res = res + *iter;
                    iter++;
                }
                que.clear();
                res = res + " ";
            }
        }
        auto iter = que.begin();
        while (iter != que.end()) {
            res = res + *iter;
            iter++;
        }
        return res;
    }
};

// 用string
class Solution {
public:
    string reverseWords(string s) {
        string res = "";
        int pos = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s[i] != ' ') {
                res.insert(pos, s.substr(i, 1));
            } else {
                res = res + " ";
                pos = i + 1;
            }
        }
        return res;
    }
};

他山之石:

原来C++可以直接操作让string的部分区间进行反转,那就只需要记录空格的位置,然后将之间的区域进行反转就行了,也不用创建结果字符串,直接在原字符串上操作即可,速度快了一倍。

class Solution {
public:
    string reverseWords(string s) {
        for (int i = 0; i < s.length(); i++) {
            if (s[i] != ' ') {   // when i is a non-space
                int j = i;
                for (; j < s.length() && s[j] != ' '; j++) { } // move j to the next space
                reverse(s.begin() + i, s.begin() + j);
                i = j - 1;
            }
        }
        
        return s;
    }
};

合集:https://github.com/Cloudox/LeetCode-Record


查看作者首页

你可能感兴趣的:(LeetCode笔记:557. Reverse Words in a String III)