zoukankan      html  css  js  c++  java
  • [leetcode] Generate Parentheses

    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:

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

    https://oj.leetcode.com/problems/generate-parentheses/

    思路1:自己模仿permutation之类的题目,一个一个往数据里面填,填的时候判断是否是valid的,每次都要统计括号数,麻烦。

    思路2:改进思路1,也是递归实现,将已有的左右括号数作为参数递归下去,写起来很简洁。

    思路1:

    public class Solution {
    	public ArrayList<String> generateParenthesis(int n) {
    		ArrayList<String> result = new ArrayList<String>();
    		if (n <= 0)
    			return result;
    		n = n * 2;
    		char str[] = new char[n];
    		generate(0, n, str, result);
    
    		return result;
    	}
    
    	private void generate(int cur, int n, char[] s, ArrayList<String> result) {
    		if (cur == n) {
    			result.add(new String(s));
    		} else {
    			int j;
    			int cntL = 0, cntR = 0;
    			for (j = 0; j < cur; j++) {
    				if (s[j] == '(')
    					cntL++;
    				else
    					cntR++;
    			}
    			if (cntL > cntR) {
    				s[cur] = ')';
    				generate(cur + 1, n, s, result);
    
    				if (cntL < n / 2) {
    					s[cur] = '(';
    					generate(cur + 1, n, s, result);
    				}
    			} else if (cntL == cntR) {
    				s[cur] = '(';
    				generate(cur + 1, n, s, result);
    			} else {
    				return;
    			}
    
    		}
    
    	}
    
    	public static void main(String[] args) {
    		System.out.println(new Solution().generateParenthesis(3));
    	}
    
    }

    思路2:

    import java.util.ArrayList;
    
    public class Solution {
        public ArrayList<String> generateParenthesis(int n) {
            ArrayList<String> res = new ArrayList<String>();
            if (n <= 0)
                return res;
            StringBuilder sb = new StringBuilder();
            generate(n, n, sb, res);
            return res;
        }
    
        private void generate(int l, int r, StringBuilder sb, ArrayList<String> res) {
            if (r < l)
                return;
            if (l == 0 && r == 0) {
                res.add(sb.toString());
            }
            if (l > 0) {
                sb.append("(");
                generate(l - 1, r, sb, res);
                sb.deleteCharAt(sb.length() - 1);
            }
            if (r > 0) {
                sb.append(")");
                generate(l, r - 1, sb, res);
                sb.deleteCharAt(sb.length() - 1);
            }
        }
    
        public static void main(String[] args) {
            System.out.println(new Solution().generateParenthesis(3));
        }
    
    }

    第二遍记录:将已经用过的( 和 ) 传递下去,根据数量判断是否要继续添加,最后注意终止条件的(和)的数目都是n。

    public class Solution {
        public List<String> generateParenthesis(int n) {
            List<String> res = new ArrayList<String>();
            if (n <= 0)
                return res;
            StringBuilder sb = new StringBuilder();
            generate(0, 0, sb, res, n);
            return res;
        }
    
        private void generate(int lUsed, int rUsed, StringBuilder sb, List<String> res, int n) {
            if (lUsed < rUsed)
                return;
            if (lUsed == n && rUsed == n) {
                res.add(sb.toString());
            }
            if (lUsed < n) {
                sb.append("(");
                generate(lUsed + 1, rUsed, sb, res, n);
                sb.deleteCharAt(sb.length() - 1);
            }
    
            if (rUsed < n) {
                sb.append(")");
                generate(lUsed, rUsed + 1, sb, res, n);
                sb.deleteCharAt(sb.length() - 1);
            }
    
        }
       
    }

    第三遍记录: 递推向下时,忘记判断 l>0 和 r>0了。 否则 l和r一直减一变成负数了。。

    if (l > 0) {
                sb.append("(");
                generate(l - 1, r, sb, res);
                sb.deleteCharAt(sb.length() - 1);
            }

    第四遍记录:

    先填(,注意不能超过n个,再填),注意不能超过n,也不能超过前面的(的数量。填满到2n保存结果。

    import java.util.ArrayList;
    import java.util.List;
    
    public class Solution {
        public List<String> generateParenthesis(int n) {
            List<String> res = new ArrayList<String>();
            StringBuilder sb = new StringBuilder();
            if (n <= 0)
                return res;
            geneParen(0, 0, n, sb, res);
    
            return res;
        }
    
        private void geneParen(int left, int right, int n, StringBuilder sb, List<String> res) {
            if (sb.length() == 2 * n) {
                res.add(sb.toString());
                return;
            }
            if (left < n) {
                sb.append('(');
                geneParen(left + 1, right, n, sb, res);
                sb.deleteCharAt(sb.length() - 1);
            }
    
            if (right < n && right < left) {
                sb.append(')');
                geneParen(left, right + 1, n, sb, res);
                sb.deleteCharAt(sb.length() - 1);
            }
    
        }
    
        public static void main(String[] args) {
            System.out.println(new Solution().generateParenthesis(5));
        }
    }

    参考:

    http://blog.csdn.net/linhuanmars/article/details/19873463

    http://blog.csdn.net/fightforyourdream/article/details/14159435

  • 相关阅读:
    MongoDB 常用故障排查工具
    MongoDB ServerStatus返回信息
    SQL Server 2012实施与管理实战指南(笔记)——Ch6连接的建立和问题排查
    SQL Server 2012实施与管理实战指南(笔记)——Ch5启动SQL Server服务和数据库
    [20140504] ADO.NET客户端超时
    SQL Server 2012实施与管理实战指南(笔记)——Ch4数据库连接组件
    SQL Server 2012实施与管理实战指南(笔记)——Ch3Alwayson可用组
    SQL Server 2014新特性——Buffer Pool扩展
    SQL Server 2014新特性——事务持久性控制
    SQL Server 2014新特性——基数评估(白皮书阅读笔记)
  • 原文地址:https://www.cnblogs.com/jdflyfly/p/3810703.html
Copyright © 2011-2022 走看看