求出對應N的所有合法匹配括號 (DFS)---小米筆試題
阿新 • • 發佈:2019-01-26
給定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; }