• 【JAVA、C++】LeetCode 022 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:

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

    解题思路一:

    通过观察n=2和n=3的情况可以知道,只要在n=2的String 开头、末尾、'(' 插入“()”即可,注意防止重复。

    JAVA实现如下:

    static public List<String> generateParenthesis(int n) {
    		HashSet<String> set = new HashSet<String>();
    		if (n == 1)
    			set.add("()");
    		if (n > 1) {
    			ArrayList<String> lastList = new ArrayList<String>(
    					generateParenthesis(n - 1));
    			StringBuilder sb = new StringBuilder();
    			for (String string : lastList) {
    				sb = new StringBuilder(string);
    				set.add(sb.toString() + "()");
    				set.add("()" + sb.toString());
    				for (int i = 0; i < sb.length() - 1; i++) {
    					if (sb.charAt(i) == '(') {
    						sb.insert(i + 1, "()");
    						set.add(sb.toString());
    					}
    					sb = new StringBuilder(string);
    				}
    			}
    		}
    		return new ArrayList<String>(set);
    	}
    

     解题思路二:

    通过观察可以发现,任何符合条件的Parenthesis(n)总是可以分解为(generateParenthesis(k))+generateParenthesis(n-1-k),同时由于后半部分generateParenthesis(n-1-k)的唯一性,这种算法不会产生重复的元素,因此采用DFS进行一次遍历即可,这种算法更高效!JAVA实现如下:

    static public List<String> generateParenthesis(int n) {
    		List<String> list = new ArrayList<String>(), leftList, rightList;
    		if (n == 0)
    			list.add("");// 很关键,不能删除
    		if (n == 1)
    			list.add("()");
    		else {
    			for (int i = 0; i < n; i++) {
    				leftList = generateParenthesis(i);
    				rightList = generateParenthesis(n - i - 1);
    				for (String leftPart:leftList)
    					for (String rightPart:rightList)
    						list.add("(" + leftPart + ")" + rightPart);
    			}
    		}
    		return list;
    	}
    

     C++:

     1  class Solution {
     2  public:
     3      vector<string> generateParenthesis(int n) {
     4          vector<string>res;
     5          if (n == 0) {
     6              res.push_back("");
     7              return res;
     8          }
     9          if (n == 1) {
    10              res.push_back("()");
    11              return res;
    12          }
    13          for (int i = 0; i < n; i++) {
    14              vector<string> left = generateParenthesis(i);
    15              vector<string>right = generateParenthesis(n-i-1);
    16              for (string leftPart : left)
    17                  for (string rightPart : right)
    18                      res.push_back("(" + leftPart + ")" + rightPart);
    19          }
    20          return res;
    21      }
    22  };
  • 相关阅读:
    Sql Server Report 导出到EXCEL 指定行高
    SQLSqlserver中如何将一列数据,不重复的拼接成一个字符串
    SQL Server Management Studio无法记住密码
    nuget.org无法解析的办法
    js获取select标签选中的值及文本
    Word 如何实现表格快速一分为二
    sql server rdl report 如何用动态sql
    浏览器窗口刷新
    SWFUpload 在ie9上出现的bug
    历数PC发展史上的祖先们
  • 原文地址:https://www.cnblogs.com/tonyluis/p/4474103.html
Copyright © 2020-2023  润新知