对于string类型,用push_back和直接用 + 连接字符有什么区别?

我在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);
        }
    }
};

不是很明白,希望前辈们可以指导下。

阅读 8.7k
1 个回答

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题