输出括号所有合法匹配

原文链接:http://blog.csdn.net/doc_sgl/article/details/8917476

简答题最后一题,编程实现所有括号的合法匹配

如输入3

输出:"((()))”, “(()())”, “(())()”, “()(())”, “()()()”

思路:深搜+剪枝,关键在于记录已经用掉的左括号个数和右括号的个数,

1,当用过的左括号个数小于右括号则非法;

2,当二者个数和大于2N则非法;

3,当二者个数相等且数目等于2N此时输出。

#include <iostream>
using namespace std;

void DFS_bracket(char* str,int n, int left_used, int right_used)
{
    if(left_used == right_used && left_used + right_used == 2*n)
    {
        for(int i = 0; i < left_used*2; ++i)
            cout<<str[i];
        cout<<endl;
        return;
    }
    if(left_used < right_used || left_used + right_used >= 2*n)
    {
        return ;
    }
    int index = left_used + right_used;
    str[index] = ‘(‘;
    DFS_bracket(str, n, left_used + 1, right_used);

    str[index] = ‘)‘;
    DFS_bracket(str, n, left_used, right_used + 1);
}
int main()
{
    int parenthesisnum;
    cin>>parenthesisnum;

    char* str = new char[parenthesisnum*2+1];
    DFS_bracket(str,parenthesisnum,0,0);
    return 0;
}
时间: 2024-10-17 19:40:50

输出括号所有合法匹配的相关文章

正则表达式的括号与贪婪匹配

今天遇到一个正则表达式 regex = '<div class="div_result[\s\S]+?>([\s\S]+)</div>'我原以为将其与网页内容进行匹配之后会获得形如<div class="div_result...</div>这样的完整字符串,但结果只获取了<div></div>之间的内容,十分不解,上网查了之后才知道,原来括号具有获取匹配的作用:(pattern)———会匹配pattern并获取这一匹配

求出对应N的所有合法匹配括号 (DFS)---小米笔试题

给定N对括号,输出其所有的合法的组合状态,例如,N=3,所有的合法状态为:"((()))", "(()())", "(())()", "()(())", "()()()": 解析: 还是深搜DFS的思路,深搜的过程关键在于记录已经用掉的左括号个数和右括号的个数,当用过的左括号个数小于右括号则非法:当二者个数和大于2N则非法:当二者个数相等且数目等于2N则为合法. 代码如下: #include <ios

回溯法输出n对括号的合法组合

排列组合这种问题似乎用回溯法比较合适,括号只有左括号和或右扣号,把左扣号定好了,右括号也就定好了. 用一个栈来存中间结果,优先放左扣号,符合条件输出后回溯. #include <stdio.h> int main(int argc, char *argv[]) { int n = atoi(argv[1]); char s[10000]; int si = -1; //未放入栈的左括号数 int left_count = n; int i = 0; while (1) { if (left_c

(hdu step 4.3.3)Sum It Up(从n个数中选出m个数让他们的和达到指定和targetSum,输出所有的合法序列)

题目: Sum It Up Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 140 Accepted Submission(s): 73   Problem Description Given a specified total t and a list of n integers, find all distinct sums using

Uva11988 Broken Keyboard (a.k.a. Beiju Text)(就是先输出括号的字符)

Description Problem B Broken Keyboard (a.k.a. Beiju Text) You're typing a long text with a broken keyboard. Well it's not so badly broken. The only problem with the keyboard is that sometimes the "home" key or the "end" key gets automa

生成n对括号的合法全排列

1 import java.util.Scanner; 2 import java.util.Stack 3 public class Main { 4 public static void main(String []args){ 5 Scanner sc =new Scanner(System.in); 6 while(sc.hasNext()){ 7 int m =sc.nextInt(); 8 Stack<String> s =new Stack<String>(); 9

hihoCoder 1300 展胜地的鲤鱼旗 (括号匹配问题 dp)

#1300 : 展胜地的鲤鱼旗 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 岩手县北上市的「北上市立公园展胜地」,是陆奥国三大樱花名所之一.每年的四月中旬到五月初,这里都会举办盛大的祭奠.除了可以在盛开的樱花步道上乘坐观光马车徐行.还有横跨北上川上的鲤鱼旗,河畔还有当地特有的为祭奠祖先而编创的北上鬼剑舞. 假设,我们用一个包含 '(', ')'的括号字符串来区别每面鲤鱼旗的方向.一段括号序列被称为合法的,当且仅当满足两个条件:一.对于整个序列,左括号数量等于右括

Comet OJ 热身赛(K题)principal(括号匹配问题+stack模拟)

principal 已经提交 已经通过 23.66% Total Submission:131 Total Accepted:31 题目描述 阿尔比恩王国潜伏着代号白鸽队''的一群间谍.在没有任务的时候,她们会进行各种各样的训练,比如快速判断一个文档有没有语法错误,这有助于她们鉴别写文档的人受教育程度. 这次用于训练的是一个含有nn个括号的文档.括号一共有mm种,每种括号都有左括号和右括号两种形式.我们定义用如下的方式定义一个合法的文档: 1.一个空的字符串是一个合法的文档. 2.如果A,B都是

括号匹配为题(栈的思想)哈

数据结构实验之栈四:括号匹配 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给你一串字符,不超过50个字符,可能包括括号.数字.字母.标点符号.空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入 输入数据有多组,处理到文件结束. 输出 如果匹配就输出“yes”,不匹配输出“no” 示例输入 sin(20+10) {[}] 示例输出 yes no 提示 我的分析:运用栈的思想,读到左边的括号,就把它推进