LeetCode进阶之路(Generate Parentheses)

来源:互联网 发布:淘宝阿苏纳刷怪升级 编辑:程序博客网 时间:2024/05/01 09:28

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,列出n组括号符合parentheses的排列。

思路:假如n=3,列出三组括号所有的可能性,根据之前isValid找出符合要求的排列即可,但是这种方法明显会超时,中间步骤太多太繁琐。

public class Solution {    List<String> list = new ArrayList<String>();    public List<String> generateParenthesis(int n){List<String> l = new ArrayList<String>();String s = "()";StringBuffer sb = new StringBuffer();for(int i = 0; i < n;i++) {sb.append(s);}char[] ctr = new char[n*2];for(int i = 0; i < n*2 ; i++) {ctr[i] = sb.charAt(i);}arrange(ctr, 0);for(String st : list) {if(isValid(st)) {l.add(st);}}return l;}public void arrange(char[] str, int i) {if(i >= str.length) {return;}if(i == str.length - 1){if(!list.contains(String.valueOf(str))) {list.add(String.valueOf(str));}} else {for(int j = i; j < str.length; j++) {char tmp = str[j];str[j] = str[i];str[i] = tmp;arrange(str, i+1);tmp = str[j];str[j] = str[i];str[i] = tmp;}}}public boolean isValid(String s) {Map<Character, Character> map = new HashMap<Character, Character>();map.put('(', ')');map.put('{', '}');map.put('[', ']');Stack<Character> stack = new Stack<Character>();for(int i = 0; i < s.length();i++) {char curr = s.charAt(i);if(map.containsKey(curr)){stack.push(curr);continue;}if(map.containsValue(curr) && !stack.isEmpty() && map.get(stack.peek())== curr) {stack.pop();} else {return false;}}return stack.isEmpty();}

思路二:这个是参考网友的做法,是根据DSF(深度有限算法)来处理的,加上递归相当简单。

public class Solution {    public List<String> generateParenthesis(int n) {    if(n<=0)return null;    ArrayList<String>list = new ArrayList<String>();    String str = new String();    dfs(list,str,n,n);    return list;  }    private voiddfs(ArrayList<String> list, String str, int left, int right){    if(left>right)return;//problem with ")("    if(left==0&&right==0){      list.add(str);    }    if(left>0)dfs(list,str+"(",left-1,right);    if(right>0)dfs(list, str+")",left,right-1);  }}

有时间需要研究下深度有限算法和广度优先算法,毕业找工作时研究过,现在却都还回去了。

种一棵树最好的时间是十年前,其次是现在!



0 0