leetcode22题

拿到这道题目的时候,要列出所有括号的组成形式,就想到用递归的方法求解这个题目。

此题的思路是:left :表示的剩余的左括号的个数,right:表示剩余的有括号的个数。当左括号的个数和有括号的个数都等于的时候,表示此时括号得到了正确的匹配。如果某个时候,递归到左括号的个数大于有括号的个数,就会出现")(",这样的字符串,这是一种不合法的写法。另外一种情况就是当左括号大于0,给当前的字符串加一个左括号,当当前的右括号的个数大于0,就在当前的字符串的括号加一个有括号。

之前还想了一种递归的方法,写着写着就没思路了,哈哈哈,很尴尬的呢。废话少说,上段代码呗:)

class Solution {
private:
    void dpfun(int left,int right,string current,vector<string>&result)
    {
        if(left > right) return;
        if(left ==0 && right==0) return result.push_back(current);
        if(left>0) dpfun(left-1,right,current+"(",result);
        if(right>0) dpfun(left,right-1,current+")",result);
    }
public:
    vector<string> generateParenthesis(int n) {
        vector<string> result;
        dpfun(n,n,"",result);
        return result;
    }
};

另外一种解法,是在网上copy看的,方法不错。其思路是这样的:当遇到一个左括号的时候,就插入一对括号,还有总是在这个表达式前加一对括号,这就列出来所有的情况,其中可能会产生重复的情况,然后我们可以用set集合。

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        set<string> tmp;
        if(n == 0)
          tmp.insert("");
        else
        {
            vector<string>pre = generateParenthesis(n-1); //保存之前产生的结果数组
            for(int i = 0;i<pre.size();i++)
            {
                string a = pre[i];
               for(int j = 0;j<a.length();j++)
               {
                   if(a[j] == '(')
                   {
                       a.insert(a.begin() + j + 1, '(');
                       a.insert(a.begin() + j + 2, ')');
                       tmp.insert(a);
                       a.erase(a.begin() + i + 1, a.begin() + i + 3);
                   }
               }
            }
            tmp.insert("()");
        }
        return vector<string>(tmp.begin(),tmp.end());
    }
};

猜你喜欢

转载自blog.csdn.net/miracle22222/article/details/84935623
今日推荐