zoukankan      html  css  js  c++  java
  • DFS

    public class Solution {
        public List<String> generateParenthesis(int n) {
            List<String> results = new ArrayList<>();
            if (n == 0) {
                return results;
            }
            generate(0, 2 * n, "", results);
            return results;
        }
        private void generate(int level, int n, String curState, List<String> results) {
            //recursion terminstor 先写
            if (level >= n) {
                //方法一:此处判断是否合法
                if (isValid(curState)) {
                    results.add(curState);
                }
                
                return;
            }
            generate(level + 1, n, curState + "(", results);
           
            generate(level + 1, n, curState + ")", results);
        }
        private boolean isValid(String s) {
            char[] c = s.toCharArray();
            Stack stack = new Stack();
            for (int i = 0; i < c.length; i++) {
                if(c[i] == ')' && !stack.isEmpty()) {
                    stack.pop();
                } else if (c[i] == '(') {
                    stack.push(c[i]);
                } else {
                    return false;
                }
            }
            if (stack.isEmpty()) {
                return true;
            }
            return false;
        }
    }
    View Code

    O(T)有问题

    应该每步进行判断。

    public class Solution {
        public List<String> generateParenthesis(int n) {
            List<String> results = new ArrayList<>();
            if (n == 0) {
                return results;
            }
            gen(n, n, "", results);
            return results;
        }
        private void gen(int left, int right, String cur, List<String> results) {
            if (left == 0 && right == 0) {
                results.add(cur);
            }
            if (left > right) {
                return;
            }
            if (left > 0) {
                gen(left - 1, right, cur + '(', results);
            }
            if (right > 0 ) {
                gen(left, right - 1, cur + ')', results);
            }
        }
    }
    View Code

    思路:先有左括号,再有右括号。

  • 相关阅读:
    简单取色器
    第一部分实现功能:使用一个TabControl和一个Memo和TDictionary类实现文本临时存储
    功能设计笔记概要
    NFC与RFID简介
    【JAVA设计模式-第四课】观察者模式-屌丝求职记+新闻订阅
    「学习笔记」左偏树
    「SP122」STEVE
    「学习笔记」 FHQ Treap
    「整理」同余
    「目录」数论
  • 原文地址:https://www.cnblogs.com/yunyouhua/p/7099305.html
Copyright © 2011-2022 走看看