首页 > 其他 > 详细

Jan 15 - Generate Parentheses; DP; BackTracking; Recursion; Hash set;

时间:2016-01-16 07:33:45      阅读:176      评论:0      收藏:0      [点我收藏+]

一开始用hashset 对于怎么从上一个情况准确找出加一个括号后的所有可能性,找不到正确的规律,我想的是

hashset.add("("+s+")");

hashset.add("()"+s);

hashset.add(s+"()");

但并没有涵盖所有的情况。就用了DP去做; P(n) = P(n-1-i).+ “P(i)”

代码:

public class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> list = new ArrayList<>();
        if(n < 1) return list;
        return addParenthesis(n);
    }
    
    public List<String> addParenthesis(int index){
        List<String> newList = new ArrayList<>();
        if(index == 0){
            newList.add("");
            return newList;
        }
        if(index == 1){
            newList.add("()");
            return newList;
        }
        for(int k = 0; k < index; k++){
            List<String> list_left = addParenthesis(index-1-k);
            List<String> list_right = addParenthesis(k);
            for(int i = 0; i < list_left.size(); i++){
                String s_left = list_left.get(i);
                for(int j = 0; j < list_right.size(); j++){
                    String s_right  = list_right.get(j);
                    newList.add(s_left+"("+s_right+")");
                }
            }
        }
        return newList;
    }
}

  

重新用Hashset 做:做是做出来了 但是runtime有点高。。

代码:

public class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> list = new ArrayList<>();
        if(n < 1) return list;
        for(int i = 1; i <= n; i++){
            list = addParenthesis(list);
        }
        return list;
    }
    
    public List<String> addParenthesis(List<String> list){
        List<String> newList = new ArrayList<>();
        Set<String> set = new HashSet<>();
        int len = list.size();
        if(len == 0){
            newList.add("()");
            return newList;
        }
        for(int i = 0; i < len; i++){
            String s = list.get(i);
            int str_len = s.length();
            for(int j = 0; j < str_len - 1; j++){
                set.add(s.substring(0,j+1) +"()"+s.substring(j+1,str_len));
            }
            set.add("()"+s);
            set.add(s+"()");
        }
        newList = new ArrayList<>(set);
        return newList;
    }
}

  

 

Jan 15 - Generate Parentheses; DP; BackTracking; Recursion; Hash set;

原文:http://www.cnblogs.com/5683yue/p/5134883.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!