博客
关于我
LeetCode 22. 括号生成
阅读量:534 次
发布时间:2019-03-09

本文共 1725 字,大约阅读时间需要 5 分钟。

如何生成合法括号组合

思考过程

生成n对括号的所有可能组合,这听起来有点挑战性。首先想到的是暴力穷举法,但这种方法的时间复杂度太高,无法处理较大的n值。因此,考虑使用回溯法来优化生成过程。

暴力穷举的局限性

暴力穷举:对于n对括号,共有2^(2n)种可能的组合。虽然理论上可行,但实际操作中时间复杂度太高,尤其是在n较大的情况下,显然不可行。

回溯法的优势

回溯法通过剪枝,减少不必要的计算。其中,两个关键点:

  • 当左括号数小于n时,可以继续添加左括号。
  • 当左括号数等于n时,只能添加右括号。
  • 同时,必须保证右括号数不超过左括号数,以保持括号合法状态。

实现细节

设定两个变量leftright分别表示已生成的左括号和右括号的数量。当left等于right且同时等于n时,生成一个有效的组合。

每次递归可以尝试添加左括号或右括号,并立即回溯抵消不必要的状态。

验证与优化

对于n=1,预期生成"()",是正确的。对于n=2,预期生成"()()","(())",检查结果显示工作正常。

代码可以进一步优化,如使用全局字符串或递归修改同个字符串,以提高效率。

代码实现

import java.util.Vector;public class Solution {    public static void generateParenthesis(int n) {        Vector
result = new Vector<>(); backtrack(0, 0, result); return result; } private static void backtrack(int left, int right, Vector
result) { if (left == n && right == n) { result.add(getCurrentString()); return; } if (left < n) { addLeft(); } if (left > right && left <= n) { addRight(); } return; } private static void addLeft() { getCurrentString().append('('); backtrack(left + 1, right, result); getCurrentString().remove(input.length() - 1); } private static void addRight() { getCurrentString().append(')'); backtrack(left, right + 1, result); getCurrentString().remove(input.length() - 1); } private String getCurrentString() { return ...; } // (此处应补充辅助方法实现,例如使用非递归的方式构建当前字符串)}

代码解析

  • generateParenthesis方法调用回溯函数,初始化leftright为0。
  • 回溯函数检查是否完成n对括号,若完成则保存结果。
  • 如果左括号未满,尝试添加左括号并递归。
  • 如果右括号不满且括号合法,尝试添加右括号并递归。

通过这种方式,避免了不必要的计算,确保每次递归都只处理有效可能性,从而高效生成所有合法括号组合。

总结

回溯法通过状态控制和剪枝,有效地生成所有合法括号组合。这种方法的时间复杂度是可接受的,适用于n较大的情况,是解决该问题的一种高效方法。

转载地址:http://siusz.baihongyu.com/

你可能感兴趣的文章
Problem C. Dynamic Graph Matching [状态压缩DP]
查看>>
ZOJ Problem Set - 2675 Little Mammoth[圆与多边形交]
查看>>
Good Luck in CET-4 Everybody! HDU - 1847 [博弈树,BASH博弈]
查看>>
HashMap集合原理
查看>>
MySQL数据库安装及主从复制搭建
查看>>
痞子衡嵌入式:极易上手的可视化wxPython GUI构建工具(wxFormBuilder)
查看>>
痞子衡嵌入式:微处理器CPU性能测试基准(Dhrystone)
查看>>
痞子衡嵌入式:语音处理工具pzh-speech诞生记(2)- 界面构建(wxFormBuilder3.8.0)
查看>>
痞子衡嵌入式:我当选了2019年度官方论坛i.MXRT板块的顶级贡献者
查看>>
痞子衡嵌入式:盘点国内RISC-V内核MCU厂商(2020年发布产品)
查看>>
痞子衡嵌入式:分享一个i.MXRT系列配套DRAM压力测试上位机工具(i.MXRT DRAM Tester)...
查看>>
Mysql-缓存
查看>>
09-【继承、抽象类】
查看>>
Struts2-从值栈获取list集合数据(三种方式)
查看>>
LeetCode 两数之和
查看>>
98-对选择排序算法的实现和分析
查看>>
101-浅谈指针
查看>>
134-C++学习第八弹(重载)
查看>>
154-删除链表中重复元素(只保留出现一次的元素)
查看>>
254-Redis(关于hiredis)
查看>>