LeetCode 22. Generate Parentheses(构造)

题目大意:给n个'(' 和 ')',构造出所有的长度为2*n并且有效的(可匹配的)字符串。

题目分析:这道题不难,可以直接搜索出所有可能的字符串,然后再逐一判断是否合法即可。但是还有更好的办法,实际上,“判断是否合法”这一操作是冗余的,如果可以直接朝着满足可匹配性的方向进行构造,就可避免这一冗余操作,这需要换一个角度思考。

  一个有效(可匹配)字符串中, '(' 的个数决定了 ')' 的个数(从左向右看)。所以,初始时,可以看成是 “有n个 '('  还没有用、有0个 ')'  必须要用”。这样,在搜索的时候就能避开无效(不可匹配)的情况。

 

代码如下:

class Solution {
private:
    void dfs(vector<string>& s,string p,int n,int m){///已经构造好的字符串为p,还剩n个'('可用,并且必须要用m个')'。
        if(n==0&&m==0){
            s.push_back(p);
            return ;
        }
        if(m>0) dfs(s,p+')',n,m-1);
        if(n>0) dfs(s,p+'(',n-1,m+1);
    }
public:
    vector<string> generateParenthesis(int n) {
        vector<string>s;
        dfs(s,"",n,0);
        return s;
    }
};

  

你可能感兴趣的:(LeetCode 22. Generate Parentheses(构造))