鍍金池/ 問答/C++/ 對于string類型,用push_back和直接用 + 連接字符有什么區(qū)別?

對于string類型,用push_back和直接用 + 連接字符有什么區(qū)別?

我在leetcode上面做了一道題,但是對于string類型,用push_back連接字符不能通過測試,但是改為加號來連接字符,可以過了。
題目鏈接

我的兩份代碼:

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> res;
        string part = "";

        __generateParenthesis(res, part, n, n);

        return res;
    }

    void __generateParenthesis(vector<string> &res, string part, int left, int right) {
        if (left == 0 && right == 0) {
            res.push_back(part);
            return ;
        }

        if (left > 0) {
            part.push_back('(');

            __generateParenthesis(res, part, left - 1, right);
        }
        if (right > 0 && left < right) {
            part.push_back(')');
            __generateParenthesis(res, part, left, right - 1);
        }
    }
};

上面的是過不了的,但是下面的過得了:

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> res;
        string part = "";

        __generateParenthesis(res, part, n, n);

        return res;
    }

    void __generateParenthesis(vector<string> &res, string part, int left, int right) {
        if (left == 0 && right == 0) {
            res.push_back(part);
            return ;
        }

        if (left > 0) {
            // part.push_back('(');

            __generateParenthesis(res, part + '(', left - 1, right);
        }
        if (right > 0 && left < right) {
            // part.push_back(')');
            __generateParenthesis(res, part + ')', left, right - 1);
        }
    }
};

不是很明白,希望前輩們可以指導(dǎo)下。

回答
編輯回答
空白格

你在用operator+的時候, 是按值傳入的, 沒有改變part. 而push_back()時, 改變了part, 在第三個ifpart的值與你預(yù)期就不符了, 你把第二個例子都改成string temp = part; temp.push_back(...); __generateP...(..., temp, ...);應(yīng)該也能AC了.

PS: 自己寫代碼時, 別用雙下劃線開頭, 不知道你是從那裏學(xué)來的這個習(xí)慣, 在c++中必須摒棄, 因爲(wèi)這些都是保留字, 是留給標(biāo)準(zhǔn)庫用的, 你一旦起了這樣的名, 就是UB了. 所以窩看py時, 總是非常不爽...

2018年3月4日 00:47