打印 n 对括号的所有有效组合的算法

2023-12-10

我正在解决问题陈述中提出的问题。我知道我的解决方案是正确的(运行程序),但我很好奇我是否正确分析了我的代码(如下)。

def parens(num)
  return ["()"] if num == 1
  paren_arr = []
  parens(num-1).each do |paren| 
    paren_arr << paren + "()" unless "()#{paren}" == "#{paren}()"
    paren_arr << "()#{paren}"
    paren_arr << "(#{paren})"
  end
  paren_arr
end

例如,parens(3) 将输出以下内容:

["()()()", "(()())", "(())()", "()(())", "((()))"]

这是我的分析: 每个 f(n) 值的元素数量大约是 f(n-1) 的 3 倍。所以:

f(n) = 3 * f(n-1) = 3 * 3 * f(n-2) ~ (3^n) 时间成本。 通过类似的分析,堆栈将被 f(1)..f(n) 占用,因此空间复杂度应该为 3^n。

我不确定这种时间或空间的分析是否正确。一方面,堆栈仅保存 n 个函数调用,但每个调用都返回一个数组,其大小约为之前调用的 3 倍。这会影响空间成本吗?我的时间分析正确吗?


正如其他人提到的,您的解决方案不正确。

对于这个问题,我最喜欢的解决方案是通过重复地将当前字符串递增到词法上的下一个有效组合来生成所有有效组合。

“Lexically next”分为几个规则,使其变得非常简单:

  • 字符串中的第一个差异将“(”更改为“)”。否则,下一个字符串在词法上将位于当前字符串之前。

  • 第一个差异是尽可能向右。否则增量会更小。

  • 第一个差异之后的部分在词汇上是最小的,同样是因为否则会有更小的增量。在这种情况下,这意味着所有“(”都位于所有“)”之前。

因此,您所要做的就是找到最右边可以更改为“)”的“(”,将其翻转,然后附加正确数量的“(”和“)”。

我不懂 Ruby,但在 Python 中它看起来像这样:

current="(((())))"
while True:
    print(current)
    opens=0
    closes=0
    pos=0
    for i in range(len(current)-1,-1,-1):
        if current[i]==')':
            closes+=1
        else:
            opens+=1
            if closes > opens:
                pos=i
                break
    if pos<1:
        break
    current = current[:pos]+ ")" + "("*opens + ")"*(closes-1)

Output:

(((())))
((()()))
((())())
((()))()
(()(()))
(()()())
(()())()
(())(())
(())()()
()((()))
()(()())
()(())()
()()(())
()()()()

事实证明,对于许多类型的“生成所有组合”问题,这样的解决方案既简单又快速。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

打印 n 对括号的所有有效组合的算法 的相关文章

  • Ruby on Rails 中的枚举

    我是一名 C 程序员 我正在研究 ruby on Rails 但我可能在心态或其他方面遇到了一些麻烦 我有一个投票对象 该对象可以是赞成 中立或反对 我通常会让投票对象有一个像这样的字段 private VoteEnum voteEnum
  • 算法 - 树中所有节点的最大距离

    所以 找到树中两个节点之间的最长路径相当容易 但我想要的是找到从节点出发的最长路径x到树中的另一个节点 对于所有x 这个问题也可以用以下方式表达 计算从给定的树中可以生成的所有有根树的高度 One way of course is to j
  • Ruby 中 SecureRandom.urlsafe_base64(8) 的碰撞概率?

    我在用SecureRandom urlsafe base64 8 为了在我的系统中创建 URL 安全的唯一 ID 我想知道如何计算碰撞概率 我将大约 10 000 个这些 id 插入到一个数组中 我想避免检查其中一个键是否已经在数组中 但我
  • 将 n 个可变高度图像拟合为 3 个(相似长度)列布局

    我正在寻找类似于的 3 列布局piccsy com http piccsy com 给定许多宽度相同但高度不同的图像 有什么算法可以对它们进行排序以使列长度的差异最小 最好使用 Python 或 JavaScript 非常感谢您提前的帮助
  • Rails 5.2 Active Storage 添加自定义属性

    我有一个带有附件的模型 class Project lt ApplicationRecord has many attached images end 当我附加并保存图像时 我还想保存一个附加的自定义属性 display order 整数
  • 数组中 1 到 100 个奇数

    Ruby 中有什么很酷的方法可以创建一个 1 到 100 且只有奇数条目 1 3 等 的数组 我现在有一个循环 但这显然不是一个很酷的方法 有什么建议么 我当前的代码 def create 1 to 100 odd array array
  • 为什么使用 no-op 来填补 paxos 事件之间的空白是合法的?

    我正在学习Paxos算法 http research microsoft com en us um people lamport pubs paxos simple pdf http research microsoft com en us
  • Accepts_nested_attributes_for Rails 3 中的实际形式使用

    使用 Ruby on Rails 3 我半明白accepts nested attributes for是如何的supposed工作 但我无法找出以某种形式实现这一点的实用方法 例如 如果有人想在其用户页面中添加他们最近的位置 user r
  • 如何使用 minitest 运行所有测试?

    我下载了一个项目的源代码 发现了一个错误并修复了它 现在我想运行测试来看看我是否破坏了任何东西 测试是在 minitest DSL 中进行的 我如何同时运行它们 我搜索了适用的 rake 任务等 但没有找到 这是一个链接耙子 测试任务 ht
  • 如何在 Rails 3 中连接表并计算记录数?

    我有一个Collection有很多硬币的类 我正在尝试选择拥有两枚以上硬币的收藏品 目前 我可以直接通过 Ruby 来完成此操作 但效率极低 我当前的代码 collections Collection all select c c coin
  • sinatra 应用程序在运行时无法启动

    我使用的是 Ubuntu 10 10 Ruby 1 9 2 无论我做什么 我都无法在本地计算机上启动 sinatra 应用程序 你好 rb require sinatra get do Hello World end ruby hello
  • 不将所需的文件包含到 vim 全方位补全中

    如果我尝试在具有 require xxx 语句的 Ruby 文件中自动完成 它会开始扫描所需的所有文件 以及所需文件所需的文件 它每次都会这样做 是否可以使 vim 自动完成功能不扫描所需文件或仅扫描特定路径中的文件 例如仅 app 以下之
  • CSR 矩阵 - 矩阵乘法

    我有两个方阵A and B 我必须转换B to CSR Format并确定产品C A B csr C 我在网上找到了很多关于CSR 矩阵 向量乘法 http www mathcs emory edu cheung Courses 561 S
  • 从 Rails Helper 返回多个标签的最佳方法是什么?

    我想创建一个隐藏字段并在一个助手中创建一个链接 然后将两者输出到我的 erb 应该输出结果 link to something a path form hidden field something tableize value gt som
  • RNG 技术的可移植性和可重复性

    我可以使用两种方法之一来创建一个伪随机数序列 该序列具有两个重要特征 1 它可以在不同的机器上重现 2 该序列永远不会重复范围内的数字 直到所有数字都被发出 我的问题是 这两种方法在可移植性 操作系统 Python 版本等 方面是否存在潜在
  • 如何从列中创建对称矩阵?

    例如 我想转动以下列 90 175 600 650 655 660 代入矩阵 90 175 600 650 655 660 175 600 650 655 660 655 600 650 655 660 655 650 650 655 66
  • 如何告诉 Ruby 不要序列化属性或如何正确重载 marshal_dump?

    我的 AR B 中有一个不可序列化的属性 o Discussion find 6 Marshal dump o TypeError no marshal dump is defined for class Proc from irb 10
  • 为什么 n 按位和 -n 总是返回最右边的位(最后一位)

    这是Python代码片段 1 1 1 2 2 2 3 3 1 看来任何n n总是返回最右边 最后 位 我真的不知道为什么 有人可以帮助我理解这一点吗 这是由于负数以二进制表示的方式 称为二进制补码表示 创建某个数字 n 的补码 换句话说 创
  • Rails:验证字符串的最小和最大长度,但允许其为空白

    我有一个想要验证的字段 我希望该字段能够留空 但如果用户输入数据 我希望它采用某种格式 目前我在模型中使用以下验证 但这不允许用户将其留空 validates length of foo maximum gt 5 validates len
  • Ruby:基于控制台的菜单

    我有一个名称和 URL 数组 并希望以向上 向下滚动菜单的形式向用户呈现名称列表 基本上是什么dialog允许在外壳内 我调查过ncurses ruby rdialog and HighLine但它们似乎要么作为一个项目被放弃 要么甚至从它

随机推荐

  • 如何在 android 2.2 上创建新数据库之前检查现有数据库?

    在 android 2 2 上创建新数据库之前 我需要检查现有数据库 如何检查呢 use openOrCreateDatabase method 在这里阅读 编辑 public boolean checkDataBase SQLiteDat
  • 将一个表的内容复制到另一个表中

    在我当前的应用程序中 我需要将一个表的内容复制到另一个表中 通过设置innerHTML 它在 FF 中完美运行 但在 IE8 中则不行 这是我在 FF 中复制的代码 getID tableA innerHTML getID tableB i
  • 同一数据集中具有父子关系的 JQuery 数据表。如何将其显示为表中的父子行?

    我有一个嵌套数据集 数据集中很少有记录是同一数据集中其他记录的子记录 父级为 null 的记录没有任何子元素 但具有与 is 关联的值的记录将指示其在同一数据集中的父级 我如何在 jQuery Datatable 中用父子关系表示这一点 我
  • 集合的顺序是否像 python3.6 中的字典一样

    由于变化dictPython 3 6 中的实现现在默认是排序的 做set现在也维持秩序了吗 我找不到有关它的任何信息 但由于这两种数据结构在幕后工作方式非常相似 我认为情况可能如此 我知道没有任何承诺dict在所有情况下都必须订购 但大多数
  • 如何使用 Prettier 禁用元素标签中的属性破坏

    我使用 Vue CLI 生成了一个新的 Vue 项目 对于 linter 选项提示 我选择 Prettier 如何禁用对新行的属性破坏 例如 这是我的标记
  • Android 11 范围存储权限

    我的应用程序使用提供的图像的文件路径Environment getExternalStorageDirectory 创建照片相册 但使用Android 11 我将无法直接访问文件 根据 Android 开发者文档 他们最近推出了MANAGE
  • 404、500 的自定义错误页面,但默认的 500 错误消息来自哪里?

    目前正在制作中 我收到以下文本 500 Internal Server Error If you are the administrator of this website then please read this web applica
  • 如何将 CUDA 编译为 llvm IR?

    我已经尝试了三天将 CUDA 内核编译为 llvm IR 但我无法做到 我已经改变了langoptions cpp并添加了CUDA 1 在构造函数中 但 clang 仍然给我 cuda 语法的错误消息 如 synchthreads 调用 我
  • 如何在 WordPress 中调整大小/访问原始图像?

    wordpress中的图片在哪里调整大小 在数据库中 在文件夹中 我将如何调整大小original图像 不创建新版本 我问这个问题是因为我上传了相当多的图像 这些图像太大并且会减慢 WordPress 网站上的加载时间 并且我想调整它们的大
  • 通过捕获括号进行正则表达式分割 - 浏览器支持:

    看这个样本 gt 1 2 3 4 5 split 结果 1 2 3 4 5 但看看这个样本 gt 1 2 3 4 5 split 结果 1 2 3 4 5 From MDN 如果分隔符是包含捕获的正则表达式 括号 那么每次匹配分隔符时 结果
  • PyQt 中的 os.walk 类似物

    在我可以继续实现递归目录 文件搜索并对某些任务进行一些过滤之前 我想知道 Qt PyQt 是否有类似的os walk 主应用程序是 PyQt4 中的 GUI 应用程序 所有文本字段都在QStrings 和路径对象 文件 目录 使用QFile
  • 使用 setVisible(false) 打印 JFrame

    我用 2 创建了一个 Swing 应用程序JFramewindows 我想将第一帧作为主页 我在第一帧中设置打印按钮来打印第二帧 如何打印第二帧frame setVisible false 我该如何解决 我把我的代码放在下面 package
  • Mercurial 中的自定义修订属性?

    我可以为我的 hg 存储库设置自定义属性 以便我可以存储 检索每个修订版的值吗 例如 提交时东京的天气等 git 也一样吗 Mercurial 没有像 Subversion 那样内置管理属性的方式 不过 它确实有一些基础设施 您必须编写一个
  • 创建 Javascript RegExp 以查找 HTML/php 模板中的开始标签

    我正在尝试编写一个 Javascript HTML php 解析器 它将从 HTML php 源中提取所有开始标签 并返回标签和属性的类型及其值 同时监视是否应从以下位置评估值 属性 静态文本或 php 变量 问题是当我尝试编写 Javas
  • R 中系统函数的共享库问题

    我在 ubuntu 16 04 上工作 在 docker 容器内 libreoffice 已安装并且工作正常 我可以通过命令行使用它 root 07ff3fbcb3cd libreoffice version LibreOffice 5 2
  • 自动装配空指针异常

    我有一个过滤器将请求保存到数据库 但我在自动装配字段上收到 NullPointerException inboundRequestLogStore 我已经尝试过来自的建议在 Filter bean 类中使用一些 bean I ve adde
  • std::sort 获取 std::bad_alloc

    class RankList public struct RankListComparator bool operator const std pair
  • dotnet ef 数据库更新时出现与网络相关或特定于实例的错误

    我正在学习使用 Visual Studio 构建 ASP NET Core MVC 应用程序this教程 在里面 添加模型 步骤我创建了一个新的单独项目 如说明中所写 但是当我运行dotnet ef database update 出现以下
  • Java中可以通过索引(indexes)访问字符串吗?

    例如 String word schnucks word 1 x would this access the C and turn it to an x 如果上面的代码不正确 除了将其从字符串转换为字符数组之外 还有其他方法来访问各个索引吗
  • 打印 n 对括号的所有有效组合的算法

    我正在解决问题陈述中提出的问题 我知道我的解决方案是正确的 运行程序 但我很好奇我是否正确分析了我的代码 如下 def parens num return if num 1 paren arr parens num 1 each do pa