Question 2 Generate All Valid Parentheses III

Following up方向

  • 1 括号种类对合法性的影响

Key Point 1: 如何处理合法性?指增加括号种类,不考虑优先级,只考虑合不合法

  • 本质:增加了加右括号的限制(不管有多少种括号,本质不变)

对于只有小括号的题目

  • 加左括号的条件:只要有就能加

  • 加右括号的条件:已经加过的左括号的数量》 已经加过的右括号数量

对于既有小括号,又有中括号的题目

  • 加左括号的条件:只要有就能加

  • 加右括号的条件:不仅加过的我这种左括号得比我这种右括号多,上一个(那么多加过的还open着的左括号呢,我得看看那个最后一次添加的)未匹配中最后一次添加的左括号必须与我同种(match)

  • < ) not OK, (<)> not Ok also !!1

对于这道题,N种括号的题目

  • 加左括号的条件:只要有就能加

  • 加右括号的条件:不仅加过的我这种左括号得比我这种右括号多,上一个(那么多加过的还open着的左括号呢,我得看看那个最后一次添加的)未匹配中最后一次添加的左括号必须与我同种(match)

2 优先级

Key Point 2: 如何处理优先级

本质:增加了加左括号的限制(不管有多少种优先级,本质不变)

  • (< not OK 优先级错误 &&()<> OK

题目引入了优先级:左括号变得不是那么随意 不能有就加了

加左括号的条件:上一个(那么多加过的还openopen着的左括号呢,我得看看那个最后一次添加的)未匹配中最后一次添加的左括号, 必须,大于等于,我现在要加的左括号的优先级

概念:上一个加的左括号 !=上一个未匹配的左括号

Modeling:如何Model括号的优先级: Map +数字

public class Solution {
    private static final char[] allP = {
        '(', ')',   '<', '>',   '{', '}',
    }
    public List<String> ValidParenthese(int l, int m, int n) {
        List<String> result = new ArrayList<>();
        Map<Character, Integer> priority = new HashMap<>();
        priorty.put("(", 0);
        priorty.put("<", 1);
        priorty.put("{", 2);
        StringBuilder sb = new StringBuilder();
        Deque<Character> stack = new ArrayQueue<>();
        int[] remain = {l, l, m, m, n ,n};
        int total = 2 * l + 2 * m + 2 * n;
        DFS(remain, result, total, sb, stack, priority);
        return result;
    }

}

Last updated