代码编织梦想

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例:

输入:n = 3
输出:[
       "((()))",
       "(()())",
       "(())()",
       "()(())",
       "()()()"
     ]

题解:
为了生成所有序列,我们可以使用递归。长度为 n 的序列就是在长度为 n-1 的序列前加一个 ‘(’ 或 ‘)’。

为了检查序列是否有效,我们遍历这个序列,并使用一个变量 balance 表示左括号的数量减去右括号的数量。如果在遍历过程中 balance 的值小于零,或者结束时 balance 的值不为零,那么该序列就是无效的,否则它是有效的。

我们可以只在序列仍然保持有效时才添加 ‘(’ or ‘)’,而不是像 方法一 那样每次添加。我们可以通过跟踪到目前为止放置的左括号和右括号的数目来做到这一点,

如果左括号数量不大于 nn,我们可以放一个左括号。如果右括号数量小于左括号的数量,我们可以放一个右括号。

代码:

    func generateParenthesis(_ n: Int) -> [String] {
        func backtrack(ans: inout [String], cur: String, open: Int, close: Int, max: Int) -> Void {
            var curStr = cur;
            if curStr.count == max * 2 {
                ans.append(curStr);
                return;
            }
            if open < max {
                curStr.append("(");
                backtrack(ans: &ans, cur: curStr, open: open + 1, close: close, max: max);
                curStr.removeLast();
            }
            if close < open {
                curStr.append(")");
                backtrack(ans: &ans, cur: curStr, open: open, close: close + 1, max: max);
                curStr.removeLast();
            }
        }
        var ans = [String]();
        backtrack(ans: &ans, cur: "", open: 0, close: 0, max: n);
        return ans;
    }

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/LiqunZhang/article/details/111036991

300. 最长上升子序列-爱代码爱编程

链表算法题(程序员面试宝典) 解题思路主要来源于leetcode官方与《程序员面试宝典》。 300. 最长上升子序列 给定一个无序的整数数组,找到其中最长上升子序列的长度。 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 说明: 可能会有多种最长上升子

35. 搜索插入位置(python3)-爱代码爱编程

题目:https://leetcode-cn.com/problems/search-insert-position/ 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 你可以假设数组中无重复元素。 示例 1: 输入: [1,3,5,6], 5 输出: 2 示例 2: 输入:

[算法练习及思路-leetcode每日一题(Java解法)]No300.最长上升子序列-爱代码爱编程

题号:no300 题目名:最长上升子序列 原题URL:https://leetcode-cn.com/problems/longest-increasing-subsequence/ 题目描述 给定一个无序的整数数组,找到其中最长上升子序列的长度。 示例 示例 1: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最

leetcode69 x的平方根-爱代码爱编程

题目描述 题目链接 代码 public int mySqrt(int x) { int left = 0; int right = x; int res = -1; while (left <= right) { int mid = (left + righ

leetcode学习笔记150 Evaluate Reverse Polish Notation-爱代码爱编程

leetcode学习笔记150 问题方法1 问题 Evaluate Reverse Polish Notation Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, *, /. Each

leetcode 83. Remove Duplicates from Sorted List-爱代码爱编程

83. Remove Duplicates from Sorted List 难度:easy问题描述: Given a sorted linked list, delete all duplicates such that each element appear only once. 中文:移除重复的节点 Example 1: Input: 1-

iOS Texture <AsyncDisplayKit> 智能预加载-爱代码爱编程

智能预加载 当一个node能够被异步并发地渲染和测量时,它非常强大,另一个对纹理至关重要的层是智能预加载的思想。 正如在《入门》中指出的那样,在一个node容器的上下文之外使用一个node很少是有利的。这是因为所有node都有其当前接口状态的概念。 此interfaceState属性由所有容器在内部创建和维护的ASRangeController不断更

Flutter之listView加载数据 刷新以及加载更多-爱代码爱编程

import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_weight_ui/model/home_article_data

iOS LeetCode☞合并两个有序链表-爱代码爱编程

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 代码如下 func mergeTwoLists(_ l1: ListNode?, _ l2: ListNo

iOS Texture<AsyncDisplayKit> Subclassing-爱代码爱编程

Subclassing 创建子类时最重要的区别是您是编写ASDKViewController还是ASDisplayNode。这听起来很明显,但由于其中一些差异是微妙的,所以记住这一点很重要。 ASDisplayNode 虽然子类化node类似于编写UIView子类,但要遵循一些准则,以确保充分利用框架的潜力,并确保node的行为符合预期。 -ini

iOS内存相关的知识点整理-爱代码爱编程

一、原起 iOS的内存相关知识是我们开发iOS APP的基石之一,也是面试中必然会问的问题。内存知识的融会贯通,与及内存相关问题的解决,是iOS开发者必须要掌握的。 作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是我的iOS交流圈: 不管你是小白还是大牛欢迎入驻!! 分享内容包括逆向安防、算法、架构设计、多线程,网络进阶,还有底层、音

iOS马甲包上架招式-爱代码爱编程

一、什么是马甲包 马甲包是利用App store 规则漏洞,通过技术手段,多次上架同一款产品的方法。马甲包和主产品包拥有同样的内容和功能,除了icon和应用名称不能完全一致,其他基本一致。 二、为什么做马甲包,做马甲包有什么好处? 1、导量、刷榜、增加关键字覆盖 一个App的关键字是有限的,马甲包能增加我们的搜索关键词,增加我们的App被用户搜索和下