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

给定N对括号,输出其所有的合法的组合状态,例如,N=3,所有的合法状态为:"((()))”, “(()())”, “(())()”, “()(())”, “()()()”;

解析:

还是深搜DFS的思路,深搜的过程关键在于记录已经用掉的左括号个数和右括号的个数,当用过的左括号个数小于右括号则非法;当二者个数和大于2N则非法;当二者个数相等且数目等于2N则为合法。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <set>
#include <map>
#include <cmath>
#include <climits>
#include <ctime>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#define MAXN 1010
#define RST(N)memset(N, 0, sizeof(N))
using namespace std;

char str[MAXN];

void solve(int n, int ls, int rs)
{
    if(ls == rs && ls + rs == 2*n) {
        printf("%s\n", str);
        return ;
    }
    if(ls < rs || ls + rs >= 2*n) return ;
    int index = ls + rs;
    str[index] = '(';
    solve(n, ls+1, rs);
    str[index] = ')';
    solve(n, ls, rs+1);
}

int main()
{
    int n;
    while(~scanf("%d", &n)) {
        solve(n, 0, 0);
    }
    return 0;
}
时间: 2024-10-11 11:35:52

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

求链表的第一个公共节点问题(好未来笔试题)

问题描述:给定两个链表的头指针,判断两个链表是否存在公共节点,如果存在公共节点,则找出第一个公共节点. 分析:这曾经是我参加好未来的一道笔试题目,给大家分享下解法. 解法一:蛮力法.拿第一个链表的每个节点去和第二个链表的每个节点进行比较,如果都不相同,则判断出两个链表不相交. 否则输出第一个相同的节点.算法的时间复杂度为O(m*n). 解法二:辅助空间法.仔细观察可以发现,如果两个链表想要相交,则尾节点必是相交点,否则不相交. 因此我们可以从两个链表的尾部开始进行比较,如果不相同,直接判断出不相

关于给定栈求出所有合法栈的思考

前几天看到一篇关于给定几个元素,给一个出栈的顺序,判断出栈的顺序是否合法,我们也可以通过给定的元素顺序求出所有的合法的出栈顺序,困扰我的问题是如何求出给定元素的所有的排列问题,之前有篇博文也有求三个数的全序列的,但采用的是三个for循环,实在是too young too simple,效率低不说,而且没有一点实用性,总不能几个数几个for循环,这也太傻了(). 对于判断出栈的合法性问题,我先把思想写出来,至于代码实现需要过两天,求所有的合法出栈顺序有两种思路. 方案1:一种是将所有元素的排列求出

给定入栈序列,求出合法的出栈序列的个数

思想:1.利用全排列函数next_permutation()求出所有可能的序列 2.从中选出所有正确的序列 #include <iostream> #include <stack> #include <vector> #include <algorithm> using namespace std; //判断序列是否是合法的出栈序列 bool IsPopOrder(const int* pPush,const int* pPop,int n) { if (p

hdu 1536 S-Nim 博弈论,,求出SG&#39;函数就可以解决

S-Nim Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4975    Accepted Submission(s): 2141 Problem Description Arthur and his sister Caroll have been playing a game called Nim for some time now

c编程:求出4&amp;#215;4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。

//求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max,min; int max1,max2;//记录最大值的坐标 int min1,min2;//记录最小值的坐标 int i,j; int a[4][4]; //为数组赋值 for(i=0;i<4;i++) { for(j=0;j<4;j++) { scanf("%d",&

求出二维数组每一行的平均值

1 //二维数组每行输出平均值 2 //2017.3.7 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 void Rand(int arr[][100], int n); 7 void OutputAvg(int arr[][100], int n); 8 int main() 9 { 10 int arr[100][100]; 11 int n = 10; 12 int sum = 0; 13 //随机初始化数组 14 Rand(a

【c语言】输入一组整数,求出最大子序列的和

// 输入一组整数,求出最大子序列的和. // 例如:序列: - 2 11 - 4 13 - 5 - 2,则最大子序列和为20. // 序列: - 6 2 4 - 7 5 3 2 - 1 6 - 9 10 - 2,则最大子序列和为16 #include <stdio.h> int Max_Son(int *p, int len) { int Max_Sum = 0; int i, j; for (i = 0; i < len; ++i) { int sum = 0; for (j = i

求出数组中所有数字的和&amp;&amp;弹出层效果

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

欧拉计划013(ProjectEuler013):求出10个数乘积最大的

申明:之前的所有欧拉计划都是用python来写的,的确python来写,代码量极少,学习起来也很方便.但是最近为了找java工作,所以用Java来完成欧拉计划的题,来复习一下Java. Large sum Problem 13 Work out the first ten digits of the sum of the following one-hundred 50-digit numbers. 371072875339021027987979982208375902465101357402