列表

详情


CMB10. 寻找合法字符串

描述

给出一个正整数n,请给出所有的包含n个'('和n个')'的字符串,使得'('和')'可以完全匹配。
例如:
'(())()','()()()' 都是合法的;
'())()('是不合法的。
请按照__字典序__给出所有合法的字符串。

输入描述

输入为1个正整数

输出描述

输出为所有合法的字符串,用英文逗号隔开

示例1

输入:

2

输出:

(()),()()

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 332KB, 提交时间: 2019-04-30

#include "stdio.h"
   
int is_not_first = 0;
void dfs(int nl, int nr, char *result, int i){
    if(nl==0 && nr==0){
        result[i] = 0;
        if(is_not_first)
            printf(",%s",result);
        else{
            printf("%s", result);
            is_not_first = 1;
        }
        return;
    }
       
    if(nl>0){
        result[i] = '(';
        dfs(nl-1, nr, result, i+1);
    }
       
    if(nr>nl){
        result[i] = ')';
        dfs(nl,nr-1, result, i+1);
           
    }
}
   
int main(){
    int n;
    char buf[1024];
    while(scanf("%d", &n) != EOF){
        is_not_first = 0;
        dfs(n,n,buf,0);
        printf("\n");
    }
       
}

C++ 解法, 执行用时: 2ms, 内存消耗: 348KB, 提交时间: 2018-08-17

#include<bits/stdc++.h>
using namespace std;
void jianli(int left,int right,string str,vector<string>& result)
{
    if(right<left)
        return;
    if(right==0&&left==0)
        result.push_back(str);
    if(left>0)
        jianli(left-1,right,str+'(',result);
    if(right>0)
        jianli(left,right-1,str+')',result);
}
int main()
{
    int n;
    while(cin>>n)
    {
        string str;
        vector<string>result;
        jianli(n,n,str,result);
        for(int i=0;i<result.size()-1;i++)
            cout<<result[i]<<",";
        cout<<result[result.size()-1]<<endl;
    }
    return 0;
}

C++ 解法, 执行用时: 2ms, 内存消耗: 352KB, 提交时间: 2018-08-19

#include<iostream>
#include<vector>
using namespace std;
 
int main()
{
    int n;
    void generateString(int,int, string,vector<string> &);
    while(cin >> n)
    {
        vector<string> s;
        generateString(n,n,"",s);
        cout << s[0];
        for(int i = 1; i < s.size(); i++)
        {
            cout << ',' <<s[i];
        }
        cout<<endl;
    }
    return 0;
}
void generateString(int leftNum, int rightNum, string str, vector<string> &s)
{
    if (leftNum == 0 && rightNum == 0)
    {
        s.push_back(str);
    }
    if (leftNum > 0)generateString(leftNum - 1, rightNum, str + '(', s);
    if (rightNum > 0 && rightNum > leftNum)generateString(leftNum, rightNum - 1, str + ')', s);
}

C 解法, 执行用时: 2ms, 内存消耗: 372KB, 提交时间: 2020-12-23

#include<stdio.h>
int is_no_first=0;
void dfs(int nl,int nr,char*result,int i)
{
    if(nl==0&&nr==0)
    {
        result[i]=0;
        if(is_no_first)
            printf(",%s",result);
        else
        {
            printf("%s",result);
            is_no_first=1;
        }
        return;
    }
if(nl>0)
{
    result[i]='(';
    dfs(nl-1,nr,result,i+1);
}
    if(nr>nl)
    {
        result[i]=')';
        dfs(nl,nr-1,result,i+1);
    }
}
int main()
{
    int n;
    char buf[1024];
    while(scanf("%d",&n)!=EOF)
    {
        is_no_first=0;
        dfs(n,n,buf,0);
        printf("\n");
        
    }
}

C 解法, 执行用时: 2ms, 内存消耗: 372KB, 提交时间: 2020-11-25

#include<stdio.h>
int is_no_first=0;
void dfs(int nl,int nr,char*result,int i)
{
    if(nl==0&&nr==0)
    {
        result[i]=0;
        if(is_no_first)
            printf(",%s",result);
        else
        {
            printf("%s",result);
            is_no_first=1;
        }
        return;
    }
if(nl>0)
{
    result[i]='(';
    dfs(nl-1,nr,result,i+1);
}
    if(nr>nl)
    {
        result[i]=')';
        dfs(nl,nr-1,result,i+1);
    }
}
int main()
{
    int n;
    char buf[1024];
    while(scanf("%d",&n)!=EOF)
    {
        is_no_first=0;
        dfs(n,n,buf,0);
        printf("\n");
        
    }
}

上一题