• 【leetcode】 Generate Parentheses (middle)☆


    Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

    For example, given n = 3, a solution set is:

    "((()))", "(()())", "(())()", "()(())", "()()()"

    思路:产生所有合理的括号配对

    我自己用的回溯法,遍历所有压入第k个')'时前面'('个数

    class Solution {
    public:
        vector<string> generateParenthesis(int n) {
            vector<string> ans;
            if(n == 0)
                return ans;
    
            vector<vector<char>> S(n); //放入第k个右括号时,已经放入的左括号数目
            int k = 0;
            for(int i = k + 1; i <= n; i++)
            {
                S[k].push_back(i);
            }
            string X;
            while(k >= 0)
            {
                while(!S[k].empty())
                {
                    int numOfLeftP = getNumOfLeft(X); //还没有放入的左括号数目
                    while(numOfLeftP < S[k].back()) //如果X中"("少于需要的,压入"("
                    {
                        X.append("(");
                        numOfLeftP++;
                    }
                    while(numOfLeftP > S[k].back()) //如果X中"("多于需要的,弹出
                    {
                        char back = X.back();
                        X.pop_back();
                        if(back == '(')
                        {
                            numOfLeftP--;
                        }
                    }
                    X.append(")"); //压入新的")"
                    int back = S[k].back(); 
                    S[k].pop_back();
    
                    if(k < n - 1)
                    {
                        k++;
                        int num = max(back, k + 1); //可以选择的已有左括号数必须大于当前已有的 小于等于n
                        for(int i = num; i <= n; i++)
                        {
                            S[k].push_back(i);
                        }
                    }
                    else
                    {
                        ans.push_back(X);
                    }
                }
                k--;
            }
            return ans;
        }
    
        int getNumOfLeft(string X)
        {
            int position=0;  
            int i=0;  
            while((position=X.find_first_of("(",position))!=string::npos)  
            {   
                position++;  
                i++;  
            }  
            return i;
        }
    
    };

    我的思路很繁琐,中间要做各种判断,看下大神的。

    产生长度为 2*n的括号, 但是不能随便产生

    设len是当前的字符串长度, v是当前完整配对的括号对数

    如果 len - v < n 还可以放入'('

    如果 2 * v < len 还可以放入')'

    当长度符合条件就压入答案,只有这时stack长度才会减小,其他长度下会压入新值。

    vector<string> generateParenthesis2(int n) {
            vector<string> ans;
            vector<string> stack;
            vector<int> validationStack;
            stack.push_back("(");
            validationStack.push_back(0);
            while(stack.size() != 0)
            {
                string s = stack.back();
                stack.pop_back();
                int v = validationStack.back();
                validationStack.pop_back();
                if(s.length() == 2 * n)
                {
                    ans.push_back(s);
                    continue;
                }
                if(s.length() - v < n)
                {
                    stack.push_back(s.append("("));
                    validationStack.push_back(v);
                    s.pop_back();
                }
                if(2 * v < s.length())
                {
                    stack.push_back(s.append(")"));
                    validationStack.push_back(v + 1);
                    s.pop_back();
                }
            }
            return ans;
            
        }
  • 相关阅读:
    手脱UPX v0.89.6
    手脱ASPack v2.12
    为什么每次进入命令都要重新source /etc/profile 才能生效?
    解决maven update project 后项目jdk变成1.5
    关于dubbo服务的xml配置文件报错的问题
    dubbo实际应用中的完整的pom.xml
    部署Maven项目到tomcat报错:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener【转】
    web.xml配置文件中<async-supported>true</async-supported>报错
    eclipse在线安装maven插件
    centos安装eclise启动报错
  • 原文地址:https://www.cnblogs.com/dplearning/p/4211342.html
Copyright © 2020-2023  润新知