package com.interview.leetcode.dp;
import com.interview.leetcode.utils.TreeNode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* Created_By: stefanie
* Date: 14-11-24
* Time: 下午12:47
*/
public class CatalanSeq {
//One-Sequence DP
public int catalanSeq(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
int[] nums = new int[n + 1];
nums[0] = 1;
nums[1] = 1;
for (int total = 2; total <= n; total++) {
nums[total] = 0;
for (int left = 0; left < total; left++) {
nums[total] += nums[left] * nums[total - 1 - left]; //total - 1 - left is right
}
}
return nums[n];
}
/**
* Given n, generate all structurally unique BST's (binary search trees) that store values 1...n
*/
static class UniqueBST{
//Memo DP
public List<TreeNode> generateTrees(int n) {
HashMap<String, List<TreeNode>> memo = new HashMap<>();
return generateTrees(1, n, memo);
}
private List<TreeNode> generateTrees(int low, int high, HashMap<String, List<TreeNode>> memo){
String key = low + "-" + high;
if(memo.containsKey(key)) return new ArrayList<TreeNode>(memo.get(key));
List<TreeNode> trees = new ArrayList<TreeNode>();
if(low > high) {
trees.add(null);
return trees;
}
for(int value = low; value <= high; value++){ //value as root element
List<TreeNode> leftTree = generateTrees(low, value - 1, memo);
List<TreeNode> rightTree = generateTrees(value + 1, high, memo);
for(TreeNode leftNode : leftTree){
for(TreeNode rightNode: rightTree){
TreeNode root = new TreeNode(value);
root.left = leftNode;
root.right = rightNode;
trees.add(root);
}
}
}
memo.put(key, trees);
return trees;
}
}
static class Parenthesis {
List<String> sols;
public List<String> generateParenthesis(int n) {
HashMap<String, List<String>> memo = new HashMap<>();
int left = 0;
int right = 0;
generate(left, right, n, "");
return memo.get("1-" + n);
}
public void generate(int left, int right, int total, String prefix) {
if (prefix.length() == 2 * total) {
sols.add(prefix);
return;
}
if (left < total) generate(left + 1, right, total, prefix + "(");
if (right < total && right < left) generate(left, right + 1, total, prefix + ")");
}
}
}