`
MouseLearnJava
  • 浏览: 466223 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

(广度优先搜索)打印所有可能的括号组合

阅读更多

 

问题:给定一个正整n,作为括号的对数,输出所有括号可能的组合,如
n=2
(())
()()

n = 3的情况
((()))
(()())
(())()
()(())
()()()

在之前的一篇文章中,我们采用了深度优先搜索的方式实现:(深度优先搜索)打印所有可能的括号组合

本博文中,我们将给出采用广度优先搜索的方式实现,程序如下:

public class ParenthesesGenerator {
 
    public void generateParentheses(int parenthesesCount) {
        bfs("", parenthesesCount, parenthesesCount);
    }
 
    /**
     * 采用深度搜索优先的方式 BFS(breadth-first search)
     *
     * @param currentParentheses
     * @param remanentLeftParenthesesRemain
     * @param remanentRightParenthesesRemain
     */
    private void bfs(String currentParentheses,
            int remanentLeftParenthesesRemain,
            int remanentRightParenthesesRemain) {
        /**
         * 如果左括号数和右括号数都为0的时候,表示已经找到一种解决方式, 直接输出结果
         */
        if (remanentLeftParenthesesRemain == 0
                && remanentRightParenthesesRemain == 0) {
            System.out.println(currentParentheses);
        }
 
        /**
         * 如果右括号剩余数大于左括号剩余数,则添加一个右括号,右括号剩余数减去1,然后递归调用自身
         */
        if (remanentRightParenthesesRemain > remanentLeftParenthesesRemain) {
            bfs(currentParentheses + ")", remanentLeftParenthesesRemain,
                    remanentRightParenthesesRemain - 1);
        }
 
        /**
         * 如果左括号数还有剩余,则将当前括号组成字符添加一个左括号, 然后递归调用本身
         */
        if (remanentLeftParenthesesRemain > 0) {
            bfs(currentParentheses + "(", remanentLeftParenthesesRemain - 1,
                    remanentRightParenthesesRemain);
        }
 
    }
}

 

测试程序及其结果如下

public class ParenthesesGeneratorTest {
    public static void main(String[] args) {
        ParenthesesGenerator test = new ParenthesesGenerator();
        for (int i = 1; i < 5; i++) {
            System.out.printf("有%d括号的所有组合:\n", i);
            test.generateParentheses(i);
        }
    }
}

 

有1括号的所有组合:
()
有2括号的所有组合:
()()
(())
有3括号的所有组合:
()()()
()(())
(())()
(()())
((()))
有4括号的所有组合:
()()()()
()()(())
()(())()
()(()())
()((()))
(())()()
(())(())
(()())()
(()()())
(()(()))
((()))()
((())())

原文地址 http://thecodesample.com/?p=954

更多代码实例请访问 http://thecodesample.com/

0
0
分享到:
评论

相关推荐

    算法面试通关40讲完整课件 27-31 深度优先DFS+广度优先BFS

    深度优先搜索(Depth-First Search, DFS)与广度优先搜索(Breadth-First Search, BFS)是图论和算法领域中两种重要的遍历策略,常用于解决各种问题,如搜索路径、判断连通性、拓扑排序等。在面试中,熟练掌握这两种...

    数据结构广义表所有操作

    2. 按层打印所有原子:采用广度优先搜索(BFS)的方式,逐层打印广义表中的原子元素,先打印最外层,再依次打印内层。 四、广义表的应用场景 1. 表达树形结构:广义表可以方便地表示各种树形结构,如二叉树、多叉树...

    c语言学习24点游戏源码.zip

    在算法设计上,我们可以采用深度优先搜索或广度优先搜索策略,遍历所有可能的运算组合。对于每一种组合,我们可以利用栈来辅助存储中间运算结果。例如,当遇到乘法或除法运算时,需要将当前的两个数压入栈中,然后...

    栈和队列源代码

    - **广度优先搜索(BFS)**:在图或树的遍历中,队列用于广度优先搜索。首先将根节点加入队列,然后每次从队头取出一个节点,访问其所有邻居,并将它们加入队列。 5. **银行排队系统**:模拟银行客户等待服务的...

    c语言24点游戏源(C语言课程设计).rar

    4. **递归搜索**:为了找到所有可能的运算组合,程序通常采用深度优先搜索(DFS)或广度优先搜索(BFS)策略。每一步都是对当前的四个数进行一次运算,然后递归地处理剩下的三个数,直到所有可能的组合都被尝试过。 ...

    数据结构考研习题-第三章栈和队列.rar

    同时,队列也是实现广度优先搜索(BFS)的基础数据结构。 在第三章的习题中,可能涉及以下知识点: 1. 栈的基本操作与实现:理解栈的基本操作,如初始化、压栈、弹栈、判空和查找栈顶元素。栈可以通过数组或链表来...

    Lab I Calculator

    6. **算法设计**:求解表达式可能涉及不同的算法,如深度优先搜索(DFS)或广度优先搜索(BFS)来处理括号嵌套,或者使用栈数据结构来计算后缀表达式。对于简单算术运算,可以使用递归或迭代方法。 7. **代码组织**...

    长沙理工大学850数据结构真题2012-2020

    队列用于广度优先搜索(BFS)、打印多层队列等。考生需要熟练掌握这两种抽象数据类型的定义、操作和应用。 3. **树结构**:二叉树是基础,包括二叉搜索树、完全二叉树、满二叉树等。平衡树如AVL树和红黑树提高了...

    leetcode530-Leetcode:Leetcodepython解决方案

    广度优先搜索 问题 描述 锯齿形打印二叉树 周边区域(DFS 或 BFS) 二叉树右侧视图 课程安排 K 站内最便宜的航班 字梯II 删除无效括号 打印二叉树 最小高度树 01矩阵 字梯 两岛最短桥(DFS 和 BFS) 困水 II 硬 网络...

    四则运算表达式计算器

    - **队列**:虽然在这个场景下队列不是必需的,但在某些算法中,如广度优先搜索(BFS),队列可以帮助管理运算符或表达式中的元素。 3. **运算符优先级**: 加法和乘法具有相同的优先级,高于减法和除法。运算符...

    中国目前最经典的数据结构课件

    图算法,如深度优先搜索(DFS)和广度优先搜索(BFS),在解决许多实际问题中至关重要。 此外,哈希表是一种提供快速查找、插入和删除操作的数据结构,它通过哈希函数将键映射到表中的特定位置。散列表的平均时间...

    头歌 educoder 树和森林实验

    计算森林中所有树的叶子节点数量,我们需要遍历每棵树,对每棵树的根节点进行深度优先搜索(DFS)或广度优先搜索(BFS),并在遍历过程中记录叶子节点。这个过程涉及递归和迭代两种编程技巧。 **第2关:树转化为...

    数据结构英文课件:Chap3 Stack and Queue.ppt

    【数据结构】中的栈(Stack)与队列(Queue) ...4. **广度优先搜索(BFS)**:在图和树的遍历中,队列用于进行广度优先遍历。 理解栈和队列是掌握数据结构基础的关键,它们在编程和算法设计中扮演着重要角色。

    以前学数据结构和算法的时候写的一些程序.zip

    图的常见算法有深度优先搜索(DFS)和广度优先搜索(BFS),还有最短路径算法(如Dijkstra算法和Floyd算法)。 6. **排序算法**:排序算法是编程中不可或缺的一部分,包括冒泡排序、插入排序、选择排序、快速排序、...

    大学数据结构严蔚敏版本第三章课件

    队列在操作系统中用于任务调度、打印任务管理、网络数据包处理等,同时在广度优先搜索(BFS)算法中也起到关键作用。 在PPT课件“数据结构03.ppt”中,可能包含以下内容: 1. 栈的基本概念:定义、特性以及实例...

    清华大学_数据结构

    图结构则广泛应用于网络路由、社交网络分析等领域,图的遍历算法(深度优先搜索和广度优先搜索)和最短路径算法(如Dijkstra算法和Floyd-Warshall算法)是关键知识点。 此外,散列表(哈希表)是另一种高效的数据...

    AST整理 (1).rar_ast

    例如,函数调用可能由一个表示函数名的节点、一个表示括号的节点和若干个表示参数的节点组成。 **2. AST的创建** 创建AST的过程称为词法分析和语法分析。词法分析(Lexical Analysis)将源代码分解成一个个符号...

    LeetCode解题总结

    9. 广度优先搜索 9.1 单词变换路径(Word Ladder) 9.1.1 是否存在变换路径 9.1.2 所有最短变换路径9.2 包围区域 10. 深度优先搜索 10.1 N皇后问题 10.2 恢复IP地址 10.3 集合元素之和 10.3.1 元素可以重复 10.3.2 ...

    易语言常用算法整理.rar

    - **深度优先搜索**和**广度优先搜索**:遍历图的所有节点,解决连通性问题。 7. **数据结构**: - **栈**:后进先出(LIFO),常用于表达式求解、括号匹配等。 - **队列**:先进先出(FIFO),常用于任务调度、...

Global site tag (gtag.js) - Google Analytics